diff options
Diffstat (limited to 'fs/buffer.c')
-rw-r--r-- | fs/buffer.c | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index e1632abb4ca9..33be29675358 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -621,17 +621,17 @@ EXPORT_SYMBOL(mark_buffer_dirty_inode); | |||
621 | * If warn is true, then emit a warning if the page is not uptodate and has | 621 | * If warn is true, then emit a warning if the page is not uptodate and has |
622 | * not been truncated. | 622 | * not been truncated. |
623 | * | 623 | * |
624 | * The caller must hold mem_cgroup_begin_page_stat() lock. | 624 | * The caller must hold lock_page_memcg(). |
625 | */ | 625 | */ |
626 | static void __set_page_dirty(struct page *page, struct address_space *mapping, | 626 | static void __set_page_dirty(struct page *page, struct address_space *mapping, |
627 | struct mem_cgroup *memcg, int warn) | 627 | int warn) |
628 | { | 628 | { |
629 | unsigned long flags; | 629 | unsigned long flags; |
630 | 630 | ||
631 | spin_lock_irqsave(&mapping->tree_lock, flags); | 631 | spin_lock_irqsave(&mapping->tree_lock, flags); |
632 | if (page->mapping) { /* Race with truncate? */ | 632 | if (page->mapping) { /* Race with truncate? */ |
633 | WARN_ON_ONCE(warn && !PageUptodate(page)); | 633 | WARN_ON_ONCE(warn && !PageUptodate(page)); |
634 | account_page_dirtied(page, mapping, memcg); | 634 | account_page_dirtied(page, mapping); |
635 | radix_tree_tag_set(&mapping->page_tree, | 635 | radix_tree_tag_set(&mapping->page_tree, |
636 | page_index(page), PAGECACHE_TAG_DIRTY); | 636 | page_index(page), PAGECACHE_TAG_DIRTY); |
637 | } | 637 | } |
@@ -666,7 +666,6 @@ static void __set_page_dirty(struct page *page, struct address_space *mapping, | |||
666 | int __set_page_dirty_buffers(struct page *page) | 666 | int __set_page_dirty_buffers(struct page *page) |
667 | { | 667 | { |
668 | int newly_dirty; | 668 | int newly_dirty; |
669 | struct mem_cgroup *memcg; | ||
670 | struct address_space *mapping = page_mapping(page); | 669 | struct address_space *mapping = page_mapping(page); |
671 | 670 | ||
672 | if (unlikely(!mapping)) | 671 | if (unlikely(!mapping)) |
@@ -683,17 +682,17 @@ int __set_page_dirty_buffers(struct page *page) | |||
683 | } while (bh != head); | 682 | } while (bh != head); |
684 | } | 683 | } |
685 | /* | 684 | /* |
686 | * Use mem_group_begin_page_stat() to keep PageDirty synchronized with | 685 | * Lock out page->mem_cgroup migration to keep PageDirty |
687 | * per-memcg dirty page counters. | 686 | * synchronized with per-memcg dirty page counters. |
688 | */ | 687 | */ |
689 | memcg = mem_cgroup_begin_page_stat(page); | 688 | lock_page_memcg(page); |
690 | newly_dirty = !TestSetPageDirty(page); | 689 | newly_dirty = !TestSetPageDirty(page); |
691 | spin_unlock(&mapping->private_lock); | 690 | spin_unlock(&mapping->private_lock); |
692 | 691 | ||
693 | if (newly_dirty) | 692 | if (newly_dirty) |
694 | __set_page_dirty(page, mapping, memcg, 1); | 693 | __set_page_dirty(page, mapping, 1); |
695 | 694 | ||
696 | mem_cgroup_end_page_stat(memcg); | 695 | unlock_page_memcg(page); |
697 | 696 | ||
698 | if (newly_dirty) | 697 | if (newly_dirty) |
699 | __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); | 698 | __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); |
@@ -1167,15 +1166,14 @@ void mark_buffer_dirty(struct buffer_head *bh) | |||
1167 | if (!test_set_buffer_dirty(bh)) { | 1166 | if (!test_set_buffer_dirty(bh)) { |
1168 | struct page *page = bh->b_page; | 1167 | struct page *page = bh->b_page; |
1169 | struct address_space *mapping = NULL; | 1168 | struct address_space *mapping = NULL; |
1170 | struct mem_cgroup *memcg; | ||
1171 | 1169 | ||
1172 | memcg = mem_cgroup_begin_page_stat(page); | 1170 | lock_page_memcg(page); |
1173 | if (!TestSetPageDirty(page)) { | 1171 | if (!TestSetPageDirty(page)) { |
1174 | mapping = page_mapping(page); | 1172 | mapping = page_mapping(page); |
1175 | if (mapping) | 1173 | if (mapping) |
1176 | __set_page_dirty(page, mapping, memcg, 0); | 1174 | __set_page_dirty(page, mapping, 0); |
1177 | } | 1175 | } |
1178 | mem_cgroup_end_page_stat(memcg); | 1176 | unlock_page_memcg(page); |
1179 | if (mapping) | 1177 | if (mapping) |
1180 | __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); | 1178 | __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); |
1181 | } | 1179 | } |