Commit 7073c8e8 authored by Chris Mason's avatar Chris Mason

Btrfs: Make sure page mapping dirty tag is properly cleared

Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 3e9fd94f
...@@ -1825,12 +1825,18 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc, ...@@ -1825,12 +1825,18 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,
if (ret) if (ret)
SetPageError(page); SetPageError(page);
else { else {
unsigned long nr = end_index + 1; unsigned long max_nr = end_index + 1;
set_range_writeback(tree, cur, cur + iosize - 1); set_range_writeback(tree, cur, cur + iosize - 1);
if (!PageWriteback(page)) {
printk("warning page %lu not writeback, "
"cur %llu end %llu\n", page->index,
(unsigned long long)cur,
(unsigned long long)end);
}
ret = submit_extent_page(WRITE, tree, page, sector, ret = submit_extent_page(WRITE, tree, page, sector,
iosize, page_offset, bdev, iosize, page_offset, bdev,
&epd->bio, nr, &epd->bio, max_nr,
end_bio_extent_writepage); end_bio_extent_writepage);
if (ret) if (ret)
SetPageError(page); SetPageError(page);
...@@ -1840,6 +1846,11 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc, ...@@ -1840,6 +1846,11 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,
nr++; nr++;
} }
done: done:
if (nr == 0) {
/* make sure the mapping tag for page dirty gets cleared */
set_page_writeback(page);
end_page_writeback(page);
}
unlock_extent(tree, start, page_end, GFP_NOFS); unlock_extent(tree, start, page_end, GFP_NOFS);
unlock_page(page); unlock_page(page);
return 0; return 0;
...@@ -2408,6 +2419,13 @@ int clear_extent_buffer_dirty(struct extent_map_tree *tree, ...@@ -2408,6 +2419,13 @@ int clear_extent_buffer_dirty(struct extent_map_tree *tree,
} }
} }
clear_page_dirty_for_io(page); clear_page_dirty_for_io(page);
write_lock_irq(&page->mapping->tree_lock);
if (!PageDirty(page)) {
radix_tree_tag_clear(&page->mapping->page_tree,
page_index(page),
PAGECACHE_TAG_DIRTY);
}
write_unlock_irq(&page->mapping->tree_lock);
unlock_page(page); unlock_page(page);
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment