btrfs: have proper error handling in btrfs_init_reloc_root
authorJosef Bacik <josef@toxicpanda.com>
Fri, 12 Mar 2021 20:25:13 +0000 (15:25 -0500)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Apr 2021 15:25:20 +0000 (17:25 +0200)
create_reloc_root will return errors in the future, and __add_reloc_root
can return ENOMEM or EEXIST, so handle these errors properly.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
[ add comment ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/relocation.c

index 7966950d7f511a7bd319d7ebd9a82b4005fc8d14..22c80f5a9137b10fad10679ff4759093ff46f9c5 100644 (file)
@@ -856,9 +856,15 @@ int btrfs_init_reloc_root(struct btrfs_trans_handle *trans,
        reloc_root = create_reloc_root(trans, root, root->root_key.objectid);
        if (clear_rsv)
                trans->block_rsv = rsv;
+       if (IS_ERR(reloc_root))
+               return PTR_ERR(reloc_root);
 
        ret = __add_reloc_root(reloc_root);
-       BUG_ON(ret < 0);
+       if (ret) {
+               /* Pairs with create_reloc_root */
+               btrfs_put_root(reloc_root);
+               return ret;
+       }
        root->reloc_root = btrfs_grab_root(reloc_root);
        return 0;
 }