diff options
| -rw-r--r-- | fs/btrfs/qgroup.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 28f2b39f6a25..a5c856234323 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c | |||
| @@ -963,17 +963,28 @@ int btrfs_remove_qgroup(struct btrfs_trans_handle *trans, | |||
| 963 | struct btrfs_fs_info *fs_info, u64 qgroupid) | 963 | struct btrfs_fs_info *fs_info, u64 qgroupid) |
| 964 | { | 964 | { |
| 965 | struct btrfs_root *quota_root; | 965 | struct btrfs_root *quota_root; |
| 966 | struct btrfs_qgroup *qgroup; | ||
| 966 | int ret = 0; | 967 | int ret = 0; |
| 967 | 968 | ||
| 968 | quota_root = fs_info->quota_root; | 969 | quota_root = fs_info->quota_root; |
| 969 | if (!quota_root) | 970 | if (!quota_root) |
| 970 | return -EINVAL; | 971 | return -EINVAL; |
| 971 | 972 | ||
| 973 | /* check if there are no relations to this qgroup */ | ||
| 974 | spin_lock(&fs_info->qgroup_lock); | ||
| 975 | qgroup = find_qgroup_rb(fs_info, qgroupid); | ||
| 976 | if (qgroup) { | ||
| 977 | if (!list_empty(&qgroup->groups) || !list_empty(&qgroup->members)) { | ||
| 978 | spin_unlock(&fs_info->qgroup_lock); | ||
| 979 | return -EBUSY; | ||
| 980 | } | ||
| 981 | } | ||
| 982 | spin_unlock(&fs_info->qgroup_lock); | ||
| 983 | |||
| 972 | ret = del_qgroup_item(trans, quota_root, qgroupid); | 984 | ret = del_qgroup_item(trans, quota_root, qgroupid); |
| 973 | 985 | ||
| 974 | spin_lock(&fs_info->qgroup_lock); | 986 | spin_lock(&fs_info->qgroup_lock); |
| 975 | del_qgroup_rb(quota_root->fs_info, qgroupid); | 987 | del_qgroup_rb(quota_root->fs_info, qgroupid); |
| 976 | |||
| 977 | spin_unlock(&fs_info->qgroup_lock); | 988 | spin_unlock(&fs_info->qgroup_lock); |
| 978 | 989 | ||
| 979 | return ret; | 990 | return ret; |
