]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - mm/page-writeback.c
Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso...
[karo-tx-linux.git] / mm / page-writeback.c
index d8ac2a7fb9e7b6db9de3755ab7898095f70f8383..143c1c25d680c272eefd1e2ee7f58a0043d4f8b1 100644 (file)
@@ -650,9 +650,8 @@ int wb_domain_init(struct wb_domain *dom, gfp_t gfp)
 
        spin_lock_init(&dom->lock);
 
-       init_timer_deferrable(&dom->period_timer);
-       dom->period_timer.function = writeout_period;
-       dom->period_timer.data = (unsigned long)dom;
+       setup_deferrable_timer(&dom->period_timer, writeout_period,
+                              (unsigned long)dom);
 
        dom->dirty_limit_tstamp = jiffies;
 
@@ -2353,10 +2352,16 @@ int do_writepages(struct address_space *mapping, struct writeback_control *wbc)
 
        if (wbc->nr_to_write <= 0)
                return 0;
-       if (mapping->a_ops->writepages)
-               ret = mapping->a_ops->writepages(mapping, wbc);
-       else
-               ret = generic_writepages(mapping, wbc);
+       while (1) {
+               if (mapping->a_ops->writepages)
+                       ret = mapping->a_ops->writepages(mapping, wbc);
+               else
+                       ret = generic_writepages(mapping, wbc);
+               if ((ret != -ENOMEM) || (wbc->sync_mode != WB_SYNC_ALL))
+                       break;
+               cond_resched();
+               congestion_wait(BLK_RW_ASYNC, HZ/50);
+       }
        return ret;
 }
 
@@ -2428,7 +2433,7 @@ void account_page_dirtied(struct page *page, struct address_space *mapping)
                inode_attach_wb(inode, page);
                wb = inode_to_wb(inode);
 
-               mem_cgroup_inc_page_stat(page, MEM_CGROUP_STAT_DIRTY);
+               inc_memcg_page_state(page, NR_FILE_DIRTY);
                __inc_node_page_state(page, NR_FILE_DIRTY);
                __inc_zone_page_state(page, NR_ZONE_WRITE_PENDING);
                __inc_node_page_state(page, NR_DIRTIED);
@@ -2450,7 +2455,7 @@ void account_page_cleaned(struct page *page, struct address_space *mapping,
                          struct bdi_writeback *wb)
 {
        if (mapping_cap_account_dirty(mapping)) {
-               mem_cgroup_dec_page_stat(page, MEM_CGROUP_STAT_DIRTY);
+               dec_memcg_page_state(page, NR_FILE_DIRTY);
                dec_node_page_state(page, NR_FILE_DIRTY);
                dec_zone_page_state(page, NR_ZONE_WRITE_PENDING);
                dec_wb_stat(wb, WB_RECLAIMABLE);
@@ -2707,7 +2712,7 @@ int clear_page_dirty_for_io(struct page *page)
                 */
                wb = unlocked_inode_to_wb_begin(inode, &locked);
                if (TestClearPageDirty(page)) {
-                       mem_cgroup_dec_page_stat(page, MEM_CGROUP_STAT_DIRTY);
+                       dec_memcg_page_state(page, NR_FILE_DIRTY);
                        dec_node_page_state(page, NR_FILE_DIRTY);
                        dec_zone_page_state(page, NR_ZONE_WRITE_PENDING);
                        dec_wb_stat(wb, WB_RECLAIMABLE);
@@ -2754,7 +2759,7 @@ int test_clear_page_writeback(struct page *page)
                ret = TestClearPageWriteback(page);
        }
        if (ret) {
-               mem_cgroup_dec_page_stat(page, MEM_CGROUP_STAT_WRITEBACK);
+               dec_memcg_page_state(page, NR_WRITEBACK);
                dec_node_page_state(page, NR_WRITEBACK);
                dec_zone_page_state(page, NR_ZONE_WRITE_PENDING);
                inc_node_page_state(page, NR_WRITTEN);
@@ -2809,7 +2814,7 @@ int __test_set_page_writeback(struct page *page, bool keep_write)
                ret = TestSetPageWriteback(page);
        }
        if (!ret) {
-               mem_cgroup_inc_page_stat(page, MEM_CGROUP_STAT_WRITEBACK);
+               inc_memcg_page_state(page, NR_WRITEBACK);
                inc_node_page_state(page, NR_WRITEBACK);
                inc_zone_page_state(page, NR_ZONE_WRITE_PENDING);
        }