btrfs: handle errors from select_reloc_root()
Currently select_reloc_root() doesn't return an error, but followup patches will make it possible for it to return an error. We do have proper error recovery in do_relocation however, so handle the possibility of select_reloc_root() having an error properly instead of BUG_ON(!root). I've also adjusted select_reloc_root() to return ERR_PTR(-ENOENT) if we don't find a root, instead of NULL, to make the error case easier to deal with. I've replaced the BUG_ON(!root) with an ASSERT(0) for this case as it indicates we messed up the backref walking code, but it could also indicate corruption. Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
1c7bfa159f
commit
cbdc2ebc7c
@ -2024,8 +2024,14 @@ struct btrfs_root *select_reloc_root(struct btrfs_trans_handle *trans,
|
||||
if (!next || next->level <= node->level)
|
||||
break;
|
||||
}
|
||||
if (!root)
|
||||
return NULL;
|
||||
if (!root) {
|
||||
/*
|
||||
* This can happen if there's fs corruption or if there's a bug
|
||||
* in the backref lookup code.
|
||||
*/
|
||||
ASSERT(0);
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
||||
next = node;
|
||||
/* setup backref node path for btrfs_reloc_cow_block */
|
||||
@ -2196,7 +2202,10 @@ static int do_relocation(struct btrfs_trans_handle *trans,
|
||||
|
||||
upper = edge->node[UPPER];
|
||||
root = select_reloc_root(trans, rc, upper, edges);
|
||||
BUG_ON(!root);
|
||||
if (IS_ERR(root)) {
|
||||
ret = PTR_ERR(root);
|
||||
goto next;
|
||||
}
|
||||
|
||||
if (upper->eb && !upper->locked) {
|
||||
if (!lowest) {
|
||||
|
Loading…
Reference in New Issue
Block a user