btrfs: cleanup error handling in prepare_to_merge
authorJosef Bacik <josef@toxicpanda.com>
Fri, 12 Mar 2021 20:25:31 +0000 (15:25 -0500)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Apr 2021 15:25:22 +0000 (17:25 +0200)
This probably can't happen even with a corrupt file system, because we
would have failed much earlier on than here.  However there's no reason
we can't just check and bail out as appropriate, so do that and convert
the correctness BUG_ON() to an ASSERT().

Reviewed-by: Qu Wenruo <wqu@suse.com>
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 7d68abebf1e25fc4ebee9bbbfd5c27796ef7a6a5..01c393757721ac9d0ec9bb2da3daa3b3ad7cbea3 100644 (file)
@@ -1885,8 +1885,18 @@ again:
 
                root = btrfs_get_fs_root(fs_info, reloc_root->root_key.offset,
                                false);
-               BUG_ON(IS_ERR(root));
-               BUG_ON(root->reloc_root != reloc_root);
+               if (IS_ERR(root)) {
+                       /*
+                        * Even if we have an error we need this reloc root
+                        * back on our list so we can clean up properly.
+                        */
+                       list_add(&reloc_root->root_list, &reloc_roots);
+                       btrfs_abort_transaction(trans, (int)PTR_ERR(root));
+                       if (!err)
+                               err = PTR_ERR(root);
+                       break;
+               }
+               ASSERT(root->reloc_root == reloc_root);
 
                /*
                 * set reference count to 1, so btrfs_recover_relocation