Commit bc44d7c4 authored by Josef Bacik's avatar Josef Bacik Committed by David Sterba
Browse files

btrfs: push btrfs_grab_fs_root into btrfs_get_fs_root



Now that all callers of btrfs_get_fs_root are subsequently calling
btrfs_grab_fs_root and handling dropping the ref when they are done
appropriately, go ahead and push btrfs_grab_fs_root up into
btrfs_get_fs_root.

Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 81f096ed
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -527,12 +527,6 @@ static int resolve_indirect_ref(struct btrfs_fs_info *fs_info,
		goto out_free;
	}

	if (!btrfs_grab_fs_root(root)) {
		srcu_read_unlock(&fs_info->subvol_srcu, index);
		ret = -ENOENT;
		goto out_free;
	}

	if (btrfs_is_testing(fs_info)) {
		srcu_read_unlock(&fs_info->subvol_srcu, index);
		ret = -ENOENT;
+26 −19
Original line number Diff line number Diff line
@@ -1496,6 +1496,8 @@ static struct btrfs_root *btrfs_lookup_fs_root(struct btrfs_fs_info *fs_info,
	spin_lock(&fs_info->fs_roots_radix_lock);
	root = radix_tree_lookup(&fs_info->fs_roots_radix,
				 (unsigned long)root_id);
	if (root)
		root = btrfs_grab_fs_root(root);
	spin_unlock(&fs_info->fs_roots_radix_lock);
	return root;
}
@@ -1552,29 +1554,31 @@ struct btrfs_root *btrfs_get_fs_root(struct btrfs_fs_info *fs_info,
	int ret;

	if (location->objectid == BTRFS_ROOT_TREE_OBJECTID)
		return fs_info->tree_root;
		return btrfs_grab_fs_root(fs_info->tree_root);
	if (location->objectid == BTRFS_EXTENT_TREE_OBJECTID)
		return fs_info->extent_root;
		return btrfs_grab_fs_root(fs_info->extent_root);
	if (location->objectid == BTRFS_CHUNK_TREE_OBJECTID)
		return fs_info->chunk_root;
		return btrfs_grab_fs_root(fs_info->chunk_root);
	if (location->objectid == BTRFS_DEV_TREE_OBJECTID)
		return fs_info->dev_root;
		return btrfs_grab_fs_root(fs_info->dev_root);
	if (location->objectid == BTRFS_CSUM_TREE_OBJECTID)
		return fs_info->csum_root;
		return btrfs_grab_fs_root(fs_info->csum_root);
	if (location->objectid == BTRFS_QUOTA_TREE_OBJECTID)
		return fs_info->quota_root ? fs_info->quota_root :
					     ERR_PTR(-ENOENT);
		return btrfs_grab_fs_root(fs_info->quota_root) ?
			fs_info->quota_root : ERR_PTR(-ENOENT);
	if (location->objectid == BTRFS_UUID_TREE_OBJECTID)
		return fs_info->uuid_root ? fs_info->uuid_root :
					    ERR_PTR(-ENOENT);
		return btrfs_grab_fs_root(fs_info->uuid_root) ?
			fs_info->uuid_root : ERR_PTR(-ENOENT);
	if (location->objectid == BTRFS_FREE_SPACE_TREE_OBJECTID)
		return fs_info->free_space_root ? fs_info->free_space_root :
						  ERR_PTR(-ENOENT);
		return btrfs_grab_fs_root(fs_info->free_space_root) ?
			fs_info->free_space_root : ERR_PTR(-ENOENT);
again:
	root = btrfs_lookup_fs_root(fs_info, location->objectid);
	if (root) {
		if (check_ref && btrfs_root_refs(&root->root_item) == 0)
		if (check_ref && btrfs_root_refs(&root->root_item) == 0) {
			btrfs_put_fs_root(root);
			return ERR_PTR(-ENOENT);
		}
		return root;
	}

@@ -1607,8 +1611,18 @@ again:
	if (ret == 0)
		set_bit(BTRFS_ROOT_ORPHAN_ITEM_INSERTED, &root->state);

	/*
	 * All roots have two refs on them at all times, one for the mounted fs,
	 * and one for being in the radix tree.  This way we only free the root
	 * when we are unmounting or deleting the subvolume.  We get one ref
	 * from __setup_root, one for inserting it into the radix tree, and then
	 * we have the third for returning it, and the caller will put it when
	 * it's done with the root.
	 */
	btrfs_grab_fs_root(root);
	ret = btrfs_insert_fs_root(fs_info, root);
	if (ret) {
		btrfs_put_fs_root(root);
		if (ret == -EEXIST) {
			btrfs_free_fs_root(root);
			goto again;
@@ -3207,13 +3221,6 @@ int __cold open_ctree(struct super_block *sb,
		goto fail_qgroup;
	}

	if (!btrfs_grab_fs_root(fs_info->fs_root)) {
		fs_info->fs_root = NULL;
		err = -ENOENT;
		btrfs_warn(fs_info, "failed to grab a ref on the fs tree");
		goto fail_qgroup;
	}

	if (sb_rdonly(sb))
		return 0;

+0 −4
Original line number Diff line number Diff line
@@ -82,10 +82,6 @@ static struct dentry *btrfs_get_dentry(struct super_block *sb, u64 objectid,
		err = PTR_ERR(root);
		goto fail;
	}
	if (!btrfs_grab_fs_root(root)) {
		err = -ENOENT;
		goto fail;
	}

	key.objectid = objectid;
	key.type = BTRFS_INODE_ITEM_KEY;
+0 −4
Original line number Diff line number Diff line
@@ -292,10 +292,6 @@ static int __btrfs_run_defrag_inode(struct btrfs_fs_info *fs_info,
		ret = PTR_ERR(inode_root);
		goto cleanup;
	}
	if (!btrfs_grab_fs_root(inode_root)) {
		ret = -ENOENT;
		goto cleanup;
	}

	key.objectid = defrag->ino;
	key.type = BTRFS_INODE_ITEM_KEY;
+0 −4
Original line number Diff line number Diff line
@@ -5158,10 +5158,6 @@ 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);
Loading