btrfs: Check qgroup level in kernel qgroup assign.
Although we have qgroup level check in btrfs-progs, it's not enough since other programe may still call ioctl directly not using btrfs-progs. For example, systemd. But it's btrfs-progs to be blame since we don't provide a full-function(like subvolume create things) btrfs library with enough check, and only rely on kernel ioctl. So Add level checks in kernel too. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Reviewed-by: Josef Bacik <jbacik@fb.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
f5a6b1c53b
commit
8465ecec96
@ -1061,6 +1061,12 @@ struct btrfs_block_group_item {
|
|||||||
__le64 flags;
|
__le64 flags;
|
||||||
} __attribute__ ((__packed__));
|
} __attribute__ ((__packed__));
|
||||||
|
|
||||||
|
#define BTRFS_QGROUP_LEVEL_SHIFT 48
|
||||||
|
static inline u64 btrfs_qgroup_level(u64 qgroupid)
|
||||||
|
{
|
||||||
|
return qgroupid >> BTRFS_QGROUP_LEVEL_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* is subvolume quota turned on?
|
* is subvolume quota turned on?
|
||||||
*/
|
*/
|
||||||
|
@ -1009,6 +1009,10 @@ int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans,
|
|||||||
struct btrfs_qgroup_list *list;
|
struct btrfs_qgroup_list *list;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
/* Check the level of src and dst first */
|
||||||
|
if (btrfs_qgroup_level(src) >= btrfs_qgroup_level(dst))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&fs_info->qgroup_ioctl_lock);
|
mutex_lock(&fs_info->qgroup_ioctl_lock);
|
||||||
quota_root = fs_info->quota_root;
|
quota_root = fs_info->quota_root;
|
||||||
if (!quota_root) {
|
if (!quota_root) {
|
||||||
|
Loading…
Reference in New Issue
Block a user