btrfs: handle btrfs_cow_block errors in replace_path
authorJosef Bacik <josef@toxicpanda.com>
Fri, 12 Mar 2021 20:25:22 +0000 (15:25 -0500)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Apr 2021 15:25:21 +0000 (17:25 +0200)
If we error out COWing the root node when doing a replace_path then we
simply unlock and free the buffer and return the error.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/relocation.c

index 62b6d3f..f170215 100644 (file)
@@ -1231,7 +1231,11 @@ again:
        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) {
@@ -1291,7 +1295,11 @@ again:
                                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);