btrfs: qgroup: validate btrfs_qgroup_inherit parameter
[linux-2.6-microblaze.git] / fs / btrfs / ioctl.c
index 29e2b8e..38459a8 100644 (file)
@@ -1382,7 +1382,7 @@ static noinline int btrfs_ioctl_snap_create_v2(struct file *file,
        if (vol_args->flags & BTRFS_SUBVOL_RDONLY)
                readonly = true;
        if (vol_args->flags & BTRFS_SUBVOL_QGROUP_INHERIT) {
-               u64 nums;
+               struct btrfs_fs_info *fs_info = inode_to_fs_info(file_inode(file));
 
                if (vol_args->size < sizeof(*inherit) ||
                    vol_args->size > PAGE_SIZE) {
@@ -1395,19 +1395,9 @@ static noinline int btrfs_ioctl_snap_create_v2(struct file *file,
                        goto free_args;
                }
 
-               if (inherit->num_qgroups > PAGE_SIZE ||
-                   inherit->num_ref_copies > PAGE_SIZE ||
-                   inherit->num_excl_copies > PAGE_SIZE) {
-                       ret = -EINVAL;
-                       goto free_inherit;
-               }
-
-               nums = inherit->num_qgroups + 2 * inherit->num_ref_copies +
-                      2 * inherit->num_excl_copies;
-               if (vol_args->size != struct_size(inherit, qgroups, nums)) {
-                       ret = -EINVAL;
+               ret = btrfs_qgroup_check_inherit(fs_info, inherit, vol_args->size);
+               if (ret < 0)
                        goto free_inherit;
-               }
        }
 
        ret = __btrfs_ioctl_snap_create(file, file_mnt_idmap(file),