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: David Sterba <[email protected]>
Signed-off-by: Josef Bacik <[email protected]>
---
 fs/btrfs/disk-io.c |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 66d036b..fa8438f 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -3815,10 +3815,9 @@ static int btrfs_destroy_marked_extents(struct 
btrfs_root *root,
                        if (eb)
                                ret = test_and_clear_bit(EXTENT_BUFFER_DIRTY,
                                                         &eb->bflags);
-                       if (PageWriteback(page))
-                               end_page_writeback(page);
-
                        lock_page(page);
+
+                       wait_on_page_writeback(page);
                        if (PageDirty(page)) {
                                clear_page_dirty_for_io(page);
                                spin_lock_irq(&page->mapping->tree_lock);
-- 
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to