summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosef Bacik <josef@toxicpanda.com>2020-01-24 09:32:31 -0500
committerDavid Sterba <dsterba@suse.com>2020-03-23 17:01:28 +0100
commit8727002f79095d006a642f4f1f42372e84a77082 (patch)
tree48ffd373b84f4ea42fd1e23418c5d924f08b627c
parent02162a0265eb56742442ef42c58db8739ddd9b94 (diff)
btrfs: hold a ref on the root in fixup_tree_root_location
Looking up the inode from an arbitrary tree means we need to hold a ref on that root. Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--fs/btrfs/inode.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index d105d4d9e9aa..324fc79174e6 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -5158,6 +5158,10 @@ static int fixup_tree_root_location(struct btrfs_fs_info *fs_info,
err = PTR_ERR(new_root);
goto out;
}
+ if (!btrfs_grab_fs_root(new_root)) {
+ err = -ENOENT;
+ goto out;
+ }
*sub_root = new_root;
location->objectid = btrfs_root_dirid(&new_root->root_item);
@@ -5400,6 +5404,8 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry)
} else {
inode = btrfs_iget(dir->i_sb, &location, sub_root);
}
+ if (root != sub_root)
+ btrfs_put_fs_root(sub_root);
srcu_read_unlock(&fs_info->subvol_srcu, index);
if (!IS_ERR(inode) && root != sub_root) {