btrfs-progs: quota: add support for squota

Add a new option --simple to 'btrfs quota enable'. If set, this enables
simple quotas instead of full qgroups by using the new ioctl command
value.

Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Boris Burkov 2023-09-27 10:46:48 -07:00 committed by David Sterba
parent 4a0e715d78
commit b3104bfeda
2 changed files with 31 additions and 8 deletions

View File

@ -34,17 +34,13 @@ static const char * const quota_cmd_group_usage[] = {
NULL
};
static int quota_ctl(int cmd, int argc, char **argv)
static int quota_ctl(int cmd, char *path)
{
int ret = 0;
int fd;
char *path = argv[1];
struct btrfs_ioctl_quota_ctl_args args;
DIR *dirstream = NULL;
if (check_argc_exact(argc, 2))
return -1;
memset(&args, 0, sizeof(args));
args.cmd = cmd;
@ -67,17 +63,40 @@ static const char * const cmd_quota_enable_usage[] = {
"Any data already present on the filesystem will not count towards",
"the space usage numbers. It is recommended to enable quota for a",
"filesystem before writing any data to it.",
"",
"-s|--simple simple qgroups account ownership by extent lifetime rather than backref walks",
NULL
};
static int cmd_quota_enable(const struct cmd_struct *cmd, int argc, char **argv)
{
int ret;
int ctl_cmd = BTRFS_QUOTA_CTL_ENABLE;
clean_args_no_options(cmd, argc, argv);
optind = 0;
while (1) {
static const struct option long_options[] = {
{"simple", no_argument, NULL, 's'},
{NULL, 0, NULL, 0}
};
int c;
ret = quota_ctl(BTRFS_QUOTA_CTL_ENABLE, argc, argv);
c = getopt_long(argc, argv, "s", long_options, NULL);
if (c < 0)
break;
switch (c) {
case 's':
ctl_cmd = BTRFS_QUOTA_CTL_ENABLE_SIMPLE_QUOTA;
break;
default:
usage_unknown_option(cmd, argv);
}
}
if (check_argc_exact(argc - optind, 1))
return -1;
ret = quota_ctl(ctl_cmd, argv[optind]);
if (ret < 0)
usage(cmd, 1);
return ret;
@ -97,8 +116,10 @@ static int cmd_quota_disable(const struct cmd_struct *cmd,
clean_args_no_options(cmd, argc, argv);
ret = quota_ctl(BTRFS_QUOTA_CTL_DISABLE, argc, argv);
if (check_argc_exact(argc, 2))
return -1;
ret = quota_ctl(BTRFS_QUOTA_CTL_DISABLE, argv[1]);
if (ret < 0)
usage(cmd, 1);
return ret;

View File

@ -787,9 +787,11 @@ struct btrfs_ioctl_get_dev_stats {
};
_static_assert(sizeof(struct btrfs_ioctl_get_dev_stats) == 1032);
/* Command values for btrfs_ioctl_quota_ctl_args::cmd. */
#define BTRFS_QUOTA_CTL_ENABLE 1
#define BTRFS_QUOTA_CTL_DISABLE 2
#define BTRFS_QUOTA_CTL_RESCAN__NOTUSED 3
#define BTRFS_QUOTA_CTL_ENABLE_SIMPLE_QUOTA 4
struct btrfs_ioctl_quota_ctl_args {
__u64 cmd;
__u64 status;