From: Josef Bacik Date: Fri, 24 Jan 2020 14:32:43 +0000 (-0500) Subject: btrfs: hold a ref on the root in create_reloc_inode X-Git-Tag: v5.7-rc1~157^2~172 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=76deacf02387f0cd5b6125fb54caaabe595ffc17;p=thirdparty%2Fkernel%2Flinux.git btrfs: hold a ref on the root in create_reloc_inode We're creating a reloc inode in the data reloc tree, we need to hold a ref on the root while we're doing that. Signed-off-by: Josef Bacik Reviewed-by: David Sterba Signed-off-by: David Sterba --- diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 976917ca412a9..a257147db7a99 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -4351,10 +4351,14 @@ struct inode *create_reloc_inode(struct btrfs_fs_info *fs_info, root = read_fs_root(fs_info, BTRFS_DATA_RELOC_TREE_OBJECTID); if (IS_ERR(root)) return ERR_CAST(root); + if (!btrfs_grab_fs_root(root)) + return ERR_PTR(-ENOENT); trans = btrfs_start_transaction(root, 6); - if (IS_ERR(trans)) + if (IS_ERR(trans)) { + btrfs_put_fs_root(root); return ERR_CAST(trans); + } err = btrfs_find_free_objectid(root, &objectid); if (err) @@ -4372,6 +4376,7 @@ struct inode *create_reloc_inode(struct btrfs_fs_info *fs_info, err = btrfs_orphan_add(trans, BTRFS_I(inode)); out: + btrfs_put_fs_root(root); btrfs_end_transaction(trans); btrfs_btree_balance_dirty(fs_info); if (err) {