Btrfs: Make sure page mapping dirty tag is properly cleared
Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
3e9fd94ff0
commit
7073c8e852
|
@ -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,
|
||||||
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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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;
|
||||||
|
|
Reference in New Issue