WARN_ON(++warncount < 5);
        }
                
-       if (TestClearPageDirty(page) && account_size)
+       if (TestClearPageDirty(page) && account_size) {
+               dec_zone_page_state(page, NR_FILE_DIRTY);
                task_io_account_cancelled_write(account_size);
+       }
 }
 
-
 /*
  * If truncate cannot remove the fs-private metadata from the page, the page
  * becomes anonymous.  It will be left on the LRU and may even be mapped into
        if (page->mapping != mapping)
                return;
 
+       cancel_dirty_page(page, PAGE_CACHE_SIZE);
+
        if (PagePrivate(page))
                do_invalidatepage(page, 0);
 
-       cancel_dirty_page(page, PAGE_CACHE_SIZE);
-
        ClearPageUptodate(page);
        ClearPageMappedToDisk(page);
        remove_from_page_cache(page);