summaryrefslogtreecommitdiff
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2013-04-17 14:17:05 (GMT)
committerJosef Bacik <jbacik@fusionio.com>2013-05-06 19:54:57 (GMT)
commitb8d7f3ac10a865ca727f9373a796ef8537e3a474 (patch)
tree13474b2dd380cfe289a6e28c546d9a058138053a /fs/btrfs/disk-io.c
parentccf7f29d1a23696ca69a981adbf7eda2e13c8635 (diff)
downloadlinux-fsl-qoriq-b8d7f3ac10a865ca727f9373a796ef8537e3a474.tar.xz
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: David Sterba <dsterba@suse.cz> Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 8a7a366..aab7d89 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -3763,10 +3763,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);