aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_aops.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_aops.c')
-rw-r--r--fs/xfs/xfs_aops.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
index 095f94c2d8b5..e5099f268032 100644
--- a/fs/xfs/xfs_aops.c
+++ b/fs/xfs/xfs_aops.c
@@ -1873,6 +1873,7 @@ xfs_vm_set_page_dirty(
1873 loff_t end_offset; 1873 loff_t end_offset;
1874 loff_t offset; 1874 loff_t offset;
1875 int newly_dirty; 1875 int newly_dirty;
1876 struct mem_cgroup *memcg;
1876 1877
1877 if (unlikely(!mapping)) 1878 if (unlikely(!mapping))
1878 return !TestSetPageDirty(page); 1879 return !TestSetPageDirty(page);
@@ -1892,6 +1893,11 @@ xfs_vm_set_page_dirty(
1892 offset += 1 << inode->i_blkbits; 1893 offset += 1 << inode->i_blkbits;
1893 } while (bh != head); 1894 } while (bh != head);
1894 } 1895 }
1896 /*
1897 * Use mem_group_begin_page_stat() to keep PageDirty synchronized with
1898 * per-memcg dirty page counters.
1899 */
1900 memcg = mem_cgroup_begin_page_stat(page);
1895 newly_dirty = !TestSetPageDirty(page); 1901 newly_dirty = !TestSetPageDirty(page);
1896 spin_unlock(&mapping->private_lock); 1902 spin_unlock(&mapping->private_lock);
1897 1903
@@ -1902,13 +1908,15 @@ xfs_vm_set_page_dirty(
1902 spin_lock_irqsave(&mapping->tree_lock, flags); 1908 spin_lock_irqsave(&mapping->tree_lock, flags);
1903 if (page->mapping) { /* Race with truncate? */ 1909 if (page->mapping) { /* Race with truncate? */
1904 WARN_ON_ONCE(!PageUptodate(page)); 1910 WARN_ON_ONCE(!PageUptodate(page));
1905 account_page_dirtied(page, mapping); 1911 account_page_dirtied(page, mapping, memcg);
1906 radix_tree_tag_set(&mapping->page_tree, 1912 radix_tree_tag_set(&mapping->page_tree,
1907 page_index(page), PAGECACHE_TAG_DIRTY); 1913 page_index(page), PAGECACHE_TAG_DIRTY);
1908 } 1914 }
1909 spin_unlock_irqrestore(&mapping->tree_lock, flags); 1915 spin_unlock_irqrestore(&mapping->tree_lock, flags);
1910 __mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
1911 } 1916 }
1917 mem_cgroup_end_page_stat(memcg);
1918 if (newly_dirty)
1919 __mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
1912 return newly_dirty; 1920 return newly_dirty;
1913} 1921}
1914 1922