From: Andrew Morton Date: Sun, 10 Dec 2006 10:19:31 +0000 (-0800) Subject: [PATCH] io-accounting: write-cancel accounting X-Git-Tag: v2.6.20-rc1~145^2~61 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e08748ce01e02f0ec154b141f392ccb9555333f4;p=linux-2.6 [PATCH] io-accounting: write-cancel accounting Account for the number of byte writes which this process caused to not happen after all. Cc: Jay Lan Cc: Shailabh Nagar Cc: Balbir Singh Cc: Chris Sturtivant Cc: Tony Ernst Cc: Guillaume Thouvenin Cc: David Wright Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/fs/buffer.c b/fs/buffer.c index 904d59d1eb..d1f1b54d31 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -2853,8 +2853,13 @@ int try_to_free_buffers(struct page *page) * could encounter a non-uptodate page, which is unresolvable. * This only applies in the rare case where try_to_free_buffers * succeeds but the page is not freed. + * + * Also, during truncate, discard_buffer will have marked all + * the page's buffers clean. We discover that here and clean + * the page also. */ - clear_page_dirty(page); + if (test_clear_page_dirty(page)) + task_io_account_cancelled_write(PAGE_CACHE_SIZE); } out: if (buffers_to_free) { diff --git a/mm/truncate.c b/mm/truncate.c index e07b1e682c..9bfb8e8538 100644 --- a/mm/truncate.c +++ b/mm/truncate.c @@ -13,6 +13,7 @@ #include #include #include +#include #include /* grr. try_to_release_page, do_invalidatepage */ @@ -69,7 +70,8 @@ truncate_complete_page(struct address_space *mapping, struct page *page) if (PagePrivate(page)) do_invalidatepage(page, 0); - clear_page_dirty(page); + if (test_clear_page_dirty(page)) + task_io_account_cancelled_write(PAGE_CACHE_SIZE); ClearPageUptodate(page); ClearPageMappedToDisk(page); remove_from_page_cache(page);