summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nilfs2/segment.c2
-rw-r--r--include/linux/mm.h1
-rw-r--r--mm/page-writeback.c13
3 files changed, 14 insertions, 2 deletions
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
index d926af626177..687d090cea34 100644
--- a/fs/nilfs2/segment.c
+++ b/fs/nilfs2/segment.c
@@ -1609,7 +1609,7 @@ nilfs_copy_replace_page_buffers(struct page *page, struct list_head *out)
1609 kunmap_atomic(kaddr, KM_USER0); 1609 kunmap_atomic(kaddr, KM_USER0);
1610 1610
1611 if (!TestSetPageWriteback(clone_page)) 1611 if (!TestSetPageWriteback(clone_page))
1612 inc_zone_page_state(clone_page, NR_WRITEBACK); 1612 account_page_writeback(clone_page);
1613 unlock_page(clone_page); 1613 unlock_page(clone_page);
1614 1614
1615 return 0; 1615 return 0;
diff --git a/include/linux/mm.h b/include/linux/mm.h
index a4c66846fb8f..c36297faf7cb 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -868,6 +868,7 @@ int __set_page_dirty_no_writeback(struct page *page);
868int redirty_page_for_writepage(struct writeback_control *wbc, 868int redirty_page_for_writepage(struct writeback_control *wbc,
869 struct page *page); 869 struct page *page);
870void account_page_dirtied(struct page *page, struct address_space *mapping); 870void account_page_dirtied(struct page *page, struct address_space *mapping);
871void account_page_writeback(struct page *page);
871int set_page_dirty(struct page *page); 872int set_page_dirty(struct page *page);
872int set_page_dirty_lock(struct page *page); 873int set_page_dirty_lock(struct page *page);
873int clear_page_dirty_for_io(struct page *page); 874int clear_page_dirty_for_io(struct page *page);
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index e3bccac1f025..94159819a651 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -1129,6 +1129,17 @@ void account_page_dirtied(struct page *page, struct address_space *mapping)
1129EXPORT_SYMBOL(account_page_dirtied); 1129EXPORT_SYMBOL(account_page_dirtied);
1130 1130
1131/* 1131/*
1132 * Helper function for set_page_writeback family.
1133 * NOTE: Unlike account_page_dirtied this does not rely on being atomic
1134 * wrt interrupts.
1135 */
1136void account_page_writeback(struct page *page)
1137{
1138 inc_zone_page_state(page, NR_WRITEBACK);
1139}
1140EXPORT_SYMBOL(account_page_writeback);
1141
1142/*
1132 * For address_spaces which do not use buffers. Just tag the page as dirty in 1143 * For address_spaces which do not use buffers. Just tag the page as dirty in
1133 * its radix tree. 1144 * its radix tree.
1134 * 1145 *
@@ -1366,7 +1377,7 @@ int test_set_page_writeback(struct page *page)
1366 ret = TestSetPageWriteback(page); 1377 ret = TestSetPageWriteback(page);
1367 } 1378 }
1368 if (!ret) 1379 if (!ret)
1369 inc_zone_page_state(page, NR_WRITEBACK); 1380 account_page_writeback(page);
1370 return ret; 1381 return ret;
1371 1382
1372} 1383}