fs/buffer.c | 5 ++++- fs/xfs/xfs_aops.c | 5 ++++- mm/page-writeback.c | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/fs/buffer.c b/fs/buffer.c index 9c8eb9b6db6a..f79a9d241589 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -628,15 +628,18 @@ static void __set_page_dirty(struct page *page, struct address_space *mapping, int warn) { unsigned long flags; + bool account = false; spin_lock_irqsave(&mapping->tree_lock, flags); if (page->mapping) { /* Race with truncate? */ WARN_ON_ONCE(warn && !PageUptodate(page)); - account_page_dirtied(page, mapping); radix_tree_tag_set(&mapping->page_tree, page_index(page), PAGECACHE_TAG_DIRTY); + account = true; } spin_unlock_irqrestore(&mapping->tree_lock, flags); + if (account) + account_page_dirtied(page, mapping); } /* diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 7575cfc3ad15..59169c36765e 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1490,15 +1490,18 @@ xfs_vm_set_page_dirty( if (newly_dirty) { /* sigh - __set_page_dirty() is static, so copy it here, too */ unsigned long flags; + bool account = false; spin_lock_irqsave(&mapping->tree_lock, flags); if (page->mapping) { /* Race with truncate? */ WARN_ON_ONCE(!PageUptodate(page)); - account_page_dirtied(page, mapping); radix_tree_tag_set(&mapping->page_tree, page_index(page), PAGECACHE_TAG_DIRTY); + account = true; } spin_unlock_irqrestore(&mapping->tree_lock, flags); + if (account) + account_page_dirtied(page, mapping); } unlock_page_memcg(page); if (newly_dirty) diff --git a/mm/page-writeback.c b/mm/page-writeback.c index f4cd7d8005c9..9a6a6b99acfe 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -2517,10 +2517,10 @@ int __set_page_dirty_nobuffers(struct page *page) spin_lock_irqsave(&mapping->tree_lock, flags); BUG_ON(page_mapping(page) != mapping); WARN_ON_ONCE(!PagePrivate(page) && !PageUptodate(page)); - account_page_dirtied(page, mapping); radix_tree_tag_set(&mapping->page_tree, page_index(page), PAGECACHE_TAG_DIRTY); spin_unlock_irqrestore(&mapping->tree_lock, flags); + account_page_dirtied(page, mapping); unlock_page_memcg(page); if (mapping->host) {