We can already deal with errors appropriately from do_relocation, simply
handle any errors that come from changing the refs at this point
cleanly.  We have to abort the transaction if we fail here as we've
modified metadata at this point.

Signed-off-by: Josef Bacik <jo...@toxicpanda.com>
---
 fs/btrfs/relocation.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index 1a0e07507796..71a3db66c1ab 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -2432,10 +2432,11 @@ static int do_relocation(struct btrfs_trans_handle 
*trans,
                        btrfs_init_tree_ref(&ref, node->level,
                                            btrfs_header_owner(upper->eb));
                        ret = btrfs_inc_extent_ref(trans, &ref);
-                       BUG_ON(ret);
-
-                       ret = btrfs_drop_subtree(trans, root, eb, upper->eb);
-                       BUG_ON(ret);
+                       if (!ret)
+                               ret = btrfs_drop_subtree(trans, root, eb,
+                                                        upper->eb);
+                       if (ret)
+                               btrfs_abort_transaction(trans, ret);
                }
 next:
                if (!upper->pending)
-- 
2.26.2

Reply via email to