diff --git a/[refs] b/[refs] index 61bc4ff4b962..982430a6c4e4 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3e3b3916a9c5c28a16528585478de19fea59816b +refs/heads/master: 3a6927906f1b2adf5a31b789322d32eb8559ada0 diff --git a/trunk/mm/filemap.c b/trunk/mm/filemap.c index 188cf5fd3e8d..f4d0cded0e10 100644 --- a/trunk/mm/filemap.c +++ b/trunk/mm/filemap.c @@ -124,6 +124,18 @@ void __remove_from_page_cache(struct page *page) mapping->nrpages--; __dec_zone_page_state(page, NR_FILE_PAGES); BUG_ON(page_mapped(page)); + + /* + * Some filesystems seem to re-dirty the page even after + * the VM has canceled the dirty bit (eg ext3 journaling). + * + * Fix it up by doing a final dirty accounting check after + * having removed the page entirely. + */ + if (PageDirty(page) && mapping_cap_account_dirty(mapping)) { + dec_zone_page_state(page, NR_FILE_DIRTY); + dec_bdi_stat(mapping->backing_dev_info, BDI_RECLAIMABLE); + } } void remove_from_page_cache(struct page *page)