@@ -34,19 +34,17 @@ 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, bool simple)
{
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;
+ if (cmd == BTRFS_QUOTA_CTL_ENABLE && simple)
+ args.status = BTRFS_QUOTA_CTL_ENABLE_SIMPLE_QUOTA;
fd = btrfs_open_dir(path, &dirstream, 1);
if (fd < 0)
@@ -67,16 +65,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;
+ bool simple = false;
- 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':
+ simple = true;
+ break;
+ default:
+ usage_unknown_option(cmd, argv);
+ }
+ }
+ if (check_argc_exact(argc - optind, 1))
+ return -1;
+
+ ret = quota_ctl(BTRFS_QUOTA_CTL_ENABLE, argv[optind], simple);
if (ret < 0)
usage(cmd, 1);
@@ -97,7 +119,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], false);
if (ret < 0)
usage(cmd, 1);
@@ -786,9 +786,12 @@ struct btrfs_ioctl_get_dev_stats {
};
_static_assert(sizeof(struct btrfs_ioctl_get_dev_stats) == 1032);
+/* cmd values */
#define BTRFS_QUOTA_CTL_ENABLE 1
#define BTRFS_QUOTA_CTL_DISABLE 2
#define BTRFS_QUOTA_CTL_RESCAN__NOTUSED 3
+/* status values */
+#define BTRFS_QUOTA_CTL_ENABLE_SIMPLE_QUOTA (1UL)
struct btrfs_ioctl_quota_ctl_args {
__u64 cmd;
__u64 status;
Add a --simple flag to btrfs quota enable. If set, this enables simple quotas instead of full qgroups. This re-uses the deprecated 'status' field of the quota ioctl to avoid adding a new ioctl. Signed-off-by: Boris Burkov <boris@bur.io> --- cmds/quota.c | 41 ++++++++++++++++++++++++++++++-------- kernel-shared/uapi/btrfs.h | 3 +++ 2 files changed, 36 insertions(+), 8 deletions(-)