On 2019/8/3 上午12:10, Josef Bacik wrote:
> In testing block group removal it's sometimes handy to be able to create
> block groups on demand. Add an ioctl to allow us to force allocation
> from userspace.
Not sure if we should add another ioctl just for debug purpose.
Although I see the usefulness in such debug feature, can we move it to
something like sysfs so we can hide it more easily?
>
> Signed-off-by: Josef Bacik <josef@xxxxxxxxxxxxxx>
> ---
> fs/btrfs/ioctl.c | 30 ++++++++++++++++++++++++++++++
> include/uapi/linux/btrfs.h | 1 +
> 2 files changed, 31 insertions(+)
>
> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
> index d0743ec1231d..f100def53c29 100644
> --- a/fs/btrfs/ioctl.c
> +++ b/fs/btrfs/ioctl.c
> @@ -5553,6 +5553,34 @@ static int _btrfs_ioctl_send(struct file *file, void __user *argp, bool compat)
> return ret;
> }
>
> +static long btrfs_ioctl_alloc_chunk(struct file *file, void __user *arg)
> +{
> + struct btrfs_root *root = BTRFS_I(file_inode(file))->root;
> + struct btrfs_trans_handle *trans;
> + u64 flags;
> + int ret;
> +
> + if (!capable(CAP_SYS_ADMIN))
> + return -EPERM;
> +
> + if (copy_from_user(&flags, arg, sizeof(flags)))
> + return -EFAULT;
> +
> + /* We can only specify one type at a time. */
> + if (flags != BTRFS_BLOCK_GROUP_DATA &&
> + flags != BTRFS_BLOCK_GROUP_METADATA &&
> + flags != BTRFS_BLOCK_GROUP_SYSTEM)
> + return -EINVAL;
It looks like MIXED bg get less and less love.
> +
> + trans = btrfs_start_transaction(root, 0);
> + if (IS_ERR(trans))
> + return PTR_ERR(trans);
> +
> + ret = btrfs_chunk_alloc(trans, flags, CHUNK_ALLOC_FORCE);
And the flags lacks the profile bits, thus default to SINGLE.
Is it designed or you'd better use btrfs_force_chunk_alloc()?
Thanks,
Qu
> + btrfs_end_transaction(trans);
> + return ret < 0 ? ret : 0;
> +}
> +
> long btrfs_ioctl(struct file *file, unsigned int
> cmd, unsigned long arg)
> {
> @@ -5699,6 +5727,8 @@ long btrfs_ioctl(struct file *file, unsigned int
> return btrfs_ioctl_get_subvol_rootref(file, argp);
> case BTRFS_IOC_INO_LOOKUP_USER:
> return btrfs_ioctl_ino_lookup_user(file, argp);
> + case BTRFS_IOC_ALLOC_CHUNK:
> + return btrfs_ioctl_alloc_chunk(file, argp);
> }
>
> return -ENOTTY;
> diff --git a/include/uapi/linux/btrfs.h b/include/uapi/linux/btrfs.h
> index c195896d478f..3a6474c34ad0 100644
> --- a/include/uapi/linux/btrfs.h
> +++ b/include/uapi/linux/btrfs.h
> @@ -943,5 +943,6 @@ enum btrfs_err_code {
> struct btrfs_ioctl_get_subvol_rootref_args)
> #define BTRFS_IOC_INO_LOOKUP_USER _IOWR(BTRFS_IOCTL_MAGIC, 62, \
> struct btrfs_ioctl_ino_lookup_user_args)
> +#define BTRFS_IOC_ALLOC_CHUNK _IOR(BTRFS_IOCTL_MAGIC, 63, __u64)
>
> #endif /* _UAPI_LINUX_BTRFS_H */
>
Attachment:
signature.asc
Description: OpenPGP digital signature
