Commit b8d7f3ac authored by Josef Bacik's avatar Josef Bacik

Btrfs: don't force pages under writeback to finish when aborting

Dave reported a BUG_ON() that happened in end_page_writeback() after an abort.
This happened because we unconditionally call end_page_writeback() in the endio
case, which is right.  However when we abort the transaction we will call
end_page_writeback() on any writeback pages we find, which is wrong.  We need to
lock the page and wait on page writeback to complete if it is.  There is nothing
unsafe about this since we are discarding the transaction anyway.  Thanks,
Reported-by: default avatarDavid Sterba <dsterba@suse.cz>
Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
parent ccf7f29d
...@@ -3763,10 +3763,9 @@ static int btrfs_destroy_marked_extents(struct btrfs_root *root, ...@@ -3763,10 +3763,9 @@ static int btrfs_destroy_marked_extents(struct btrfs_root *root,
if (eb) if (eb)
ret = test_and_clear_bit(EXTENT_BUFFER_DIRTY, ret = test_and_clear_bit(EXTENT_BUFFER_DIRTY,
&eb->bflags); &eb->bflags);
if (PageWriteback(page))
end_page_writeback(page);
lock_page(page); lock_page(page);
wait_on_page_writeback(page);
if (PageDirty(page)) { if (PageDirty(page)) {
clear_page_dirty_for_io(page); clear_page_dirty_for_io(page);
spin_lock_irq(&page->mapping->tree_lock); spin_lock_irq(&page->mapping->tree_lock);
......
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