Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2cf68703 authored by Arne Jansen's avatar Arne Jansen Committed by Chris Mason
Browse files

Btrfs: prevent qgroup destroy when there are still relations



Currently you can just destroy a qgroup even though it is in use by other qgroups
or has qgroups assigned to it. This patch prevents destruction of qgroups unless
they are completely unused. Otherwise destroy will return EBUSY.

Reported-by: default avatarEric Hopper <hopper@omnifarious.org>
Signed-off-by: default avatarArne Jansen <sensille@gmx.net>
Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
parent ff24858c
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -963,17 +963,28 @@ int btrfs_remove_qgroup(struct btrfs_trans_handle *trans,
			struct btrfs_fs_info *fs_info, u64 qgroupid)
{
	struct btrfs_root *quota_root;
	struct btrfs_qgroup *qgroup;
	int ret = 0;

	quota_root = fs_info->quota_root;
	if (!quota_root)
		return -EINVAL;

	/* check if there are no relations to this qgroup */
	spin_lock(&fs_info->qgroup_lock);
	qgroup = find_qgroup_rb(fs_info, qgroupid);
	if (qgroup) {
		if (!list_empty(&qgroup->groups) || !list_empty(&qgroup->members)) {
			spin_unlock(&fs_info->qgroup_lock);
			return -EBUSY;
		}
	}
	spin_unlock(&fs_info->qgroup_lock);

	ret = del_qgroup_item(trans, quota_root, qgroupid);

	spin_lock(&fs_info->qgroup_lock);
	del_qgroup_rb(quota_root->fs_info, qgroupid);

	spin_unlock(&fs_info->qgroup_lock);

	return ret;