From: Wang Shilong Date: Sun, 7 Apr 2013 10:50:18 +0000 (+0000) Subject: Btrfs: fix missing check before creating a qgroup relation X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=b7fef4f593007d52ba7fe4427e099bd71c63c521;p=openwrt%2Fstaging%2Fblogic.git Btrfs: fix missing check before creating a qgroup relation Step to reproduce: mkfs.btrfs mount btrfs quota enable btrfs qgroup assign 0/1 1/1 umount btrfs-debug-tree | grep QGROUP If we want to add a qgroup relation, we should gurantee that 'src' and 'dst' exist, otherwise, such qgroup relation should not be allowed to create. Signed-off-by: Wang Shilong Reviewed-by: Miao Xie Signed-off-by: Josef Bacik --- diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 49c4e6398f18..0932b839550c 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c @@ -954,6 +954,8 @@ int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, u64 src, u64 dst) { struct btrfs_root *quota_root; + struct btrfs_qgroup *parent; + struct btrfs_qgroup *member; int ret = 0; mutex_lock(&fs_info->qgroup_ioctl_lock); @@ -962,6 +964,12 @@ int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans, ret = -EINVAL; goto out; } + member = find_qgroup_rb(fs_info, src); + parent = find_qgroup_rb(fs_info, dst); + if (!member || !parent) { + ret = -EINVAL; + goto out; + } ret = add_qgroup_relation_item(trans, quota_root, src, dst); if (ret)