If we error out cow'ing the root node when doing a replace_path then we
simply unlock and free the buffer and return the error.

Reviewed-by: Qu Wenruo <w...@suse.com>
Signed-off-by: Josef Bacik <jo...@toxicpanda.com>
---
 fs/btrfs/relocation.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index dfd58fa9f189..592b2d156626 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -1230,7 +1230,11 @@ int replace_path(struct btrfs_trans_handle *trans, 
struct reloc_control *rc,
        if (cow) {
                ret = btrfs_cow_block(trans, dest, eb, NULL, 0, &eb,
                                      BTRFS_NESTING_COW);
-               BUG_ON(ret);
+               if (ret) {
+                       btrfs_tree_unlock(eb);
+                       free_extent_buffer(eb);
+                       return ret;
+               }
        }
 
        if (next_key) {
@@ -1290,7 +1294,11 @@ int replace_path(struct btrfs_trans_handle *trans, 
struct reloc_control *rc,
                                ret = btrfs_cow_block(trans, dest, eb, parent,
                                                      slot, &eb,
                                                      BTRFS_NESTING_COW);
-                               BUG_ON(ret);
+                               if (ret) {
+                                       btrfs_tree_unlock(eb);
+                                       free_extent_buffer(eb);
+                                       break;
+                               }
                        }
 
                        btrfs_tree_unlock(parent);
-- 
2.26.2

Reply via email to