diff mbox series

[7/8] btrfs-progs: simple quotas enable cmd

Message ID 83c39c42c2d04a3d6bf7fdb7f63a31d3def1223f.1688599734.git.boris@bur.io (mailing list archive)
State New, archived
Headers show
Series btrfs-progs: simple quotas | expand

Commit Message

Boris Burkov July 5, 2023, 11:36 p.m. UTC
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(-)

Comments

Josef Bacik July 13, 2023, 8:26 p.m. UTC | #1
On Wed, Jul 05, 2023 at 04:36:26PM -0700, Boris Burkov wrote:
> 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.
> 

Same comment here as the kernel review about just using cmd.  Thanks,

Josef
diff mbox series

Patch

diff --git a/cmds/quota.c b/cmds/quota.c
index cd874f9ed..31d36fcd8 100644
--- a/cmds/quota.c
+++ b/cmds/quota.c
@@ -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);
diff --git a/kernel-shared/uapi/btrfs.h b/kernel-shared/uapi/btrfs.h
index d312b9f4f..34c295fd6 100644
--- a/kernel-shared/uapi/btrfs.h
+++ b/kernel-shared/uapi/btrfs.h
@@ -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;