fixup kernel loading firmware
[cascardo/linux.git] / mm / page-writeback.c
index 26adea8..ec5c91b 100644 (file)
@@ -180,11 +180,18 @@ static unsigned long highmem_dirtyable_memory(unsigned long total)
        unsigned long x = 0;
 
        for_each_node_state(node, N_HIGH_MEMORY) {
+               unsigned long nr_pages;
                struct zone *z =
                        &NODE_DATA(node)->node_zones[ZONE_HIGHMEM];
 
-               x += zone_page_state(z, NR_FREE_PAGES) +
-                    zone_reclaimable_pages(z) - z->dirty_balance_reserve;
+               nr_pages = zone_page_state(z, NR_FREE_PAGES) +
+                 zone_reclaimable_pages(z);
+               /*
+                * make sure that the number of pages for this node
+                * is never "negative".
+                */
+               nr_pages -= min(nr_pages, z->dirty_balance_reserve);
+               x += nr_pages;
        }
        /*
         * Make sure that the number of highmem pages is never larger
@@ -208,11 +215,11 @@ unsigned long global_dirtyable_memory(void)
 {
        unsigned long x;
 
-       x = global_page_state(NR_FREE_PAGES) + global_reclaimable_pages() -
-           dirty_balance_reserve;
+       x = global_page_state(NR_FREE_PAGES) + global_reclaimable_pages();
+       x -= min(x, dirty_balance_reserve);
 
        if (!vm_highmem_is_dirtyable)
-               x -= highmem_dirtyable_memory(x);
+               x -= min(x, highmem_dirtyable_memory(x));
 
        return x + 1;   /* Ensure that we never return 0 */
 }