We lookup the name of a subvol which means we'll cross into different
roots. Hold a ref while we're doing the look ups in the fs_root we're
searching.
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
u64 subvol_objectid)
{
struct btrfs_root *root = fs_info->tree_root;
- struct btrfs_root *fs_root;
+ struct btrfs_root *fs_root = NULL;
struct btrfs_root_ref *root_ref;
struct btrfs_inode_ref *inode_ref;
struct btrfs_key key;
fs_root = btrfs_get_fs_root(fs_info, &key, true);
if (IS_ERR(fs_root)) {
ret = PTR_ERR(fs_root);
+ fs_root = NULL;
+ goto err;
+ }
+ if (!btrfs_grab_fs_root(fs_root)) {
+ ret = -ENOENT;
+ fs_root = NULL;
goto err;
}
ptr[0] = '/';
btrfs_release_path(path);
}
+ btrfs_put_fs_root(fs_root);
+ fs_root = NULL;
}
btrfs_free_path(path);
return name;
err:
+ btrfs_put_fs_root(fs_root);
btrfs_free_path(path);
kfree(name);
return ERR_PTR(ret);