From 5168489a079aacd5626156ce5f8ab77325bcde15 Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Thu, 6 Feb 2020 10:24:26 -0500 Subject: [PATCH] btrfs: hold a ref on the root in get_subvol_name_from_objectid 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 Reviewed-by: David Sterba Signed-off-by: David Sterba --- fs/btrfs/super.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index a2c2e71af122..2c459d29e099 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -1028,7 +1028,7 @@ static char *get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info, 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; @@ -1099,6 +1099,12 @@ static char *get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info, 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; } @@ -1143,6 +1149,8 @@ static char *get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info, ptr[0] = '/'; btrfs_release_path(path); } + btrfs_put_fs_root(fs_root); + fs_root = NULL; } btrfs_free_path(path); @@ -1155,6 +1163,7 @@ static char *get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info, return name; err: + btrfs_put_fs_root(fs_root); btrfs_free_path(path); kfree(name); return ERR_PTR(ret); -- GitLab