diff options
Diffstat (limited to 'fs/xfs/xfs_aops.c')
-rw-r--r-- | fs/xfs/xfs_aops.c | 12 |
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 | ||