From: Josef Bacik Date: Wed, 20 Nov 2019 16:15:59 +0000 (-0800) Subject: btrfs: hold a ref on the root in fixup_tree_root_location X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ac52b896f6da7bdf8f43bc59c17dd832680ac80c;p=linux 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 --- diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 3dc9bc9530e2..5fa39ac23472 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -5689,6 +5689,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); @@ -5927,6 +5931,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) {