From e5a6610c943b0cdc29054dc2d247e7477019310d Mon Sep 17 00:00:00 2001 From: David Sterba Date: Mon, 27 Jul 2015 16:27:28 +0200 Subject: btrfs-progs: qgroup assign: add option to schedule rescan Previous patch detecs inconsistency and unconditionally triggers quota rescan. This may not be always desired as it's a heavy metadata operation. In case of batch assignments it's better to trigger the rescan at the end. Signed-off-by: David Sterba --- cmds-qgroup.c | 55 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 13 deletions(-) (limited to 'cmds-qgroup.c') diff --git a/cmds-qgroup.c b/cmds-qgroup.c index f2200b7e..4a8b8d23 100644 --- a/cmds-qgroup.c +++ b/cmds-qgroup.c @@ -37,19 +37,40 @@ static int qgroup_assign(int assign, int argc, char **argv) int ret = 0; int fd; int e; + int rescan = 0; char *path; struct btrfs_ioctl_qgroup_assign_args args; DIR *dirstream = NULL; - if (check_argc_exact(argc, 4)) + while (1) { + enum { GETOPT_VAL_RESCAN = 256 }; + static const struct option long_options[] = { + { "rescan", no_argument, NULL, GETOPT_VAL_RESCAN }, + { NULL, 0, NULL, 0 } + }; + int c = getopt_long(argc, argv, "", long_options, NULL); + + if (c < 0) + break; + switch (c) { + case GETOPT_VAL_RESCAN: + rescan = 1; + break; + default: + /* Usage printed by the caller */ + return -1; + } + } + + if (check_argc_exact(argc - optind, 3)) return -1; memset(&args, 0, sizeof(args)); args.assign = assign; - args.src = parse_qgroupid(argv[1]); - args.dst = parse_qgroupid(argv[2]); + args.src = parse_qgroupid(argv[optind]); + args.dst = parse_qgroupid(argv[optind + 1]); - path = argv[3]; + path = argv[optind + 2]; /* * FIXME src should accept subvol path @@ -82,14 +103,19 @@ static int qgroup_assign(int assign, int argc, char **argv) * INCONSISTENT bit. */ if (ret > 0) { - struct btrfs_ioctl_quota_rescan_args args; - - printf("Quota data changed, quota rescan scheduled\n"); - memset(&args, 0, sizeof(args)); - ret = ioctl(fd, BTRFS_IOC_QUOTA_RESCAN, &args); - if (ret < 0) - fprintf(stderr, "ERROR: quota rescan failed: %s\n", - strerror(errno)); + if (rescan) { + struct btrfs_ioctl_quota_rescan_args args; + + printf("Quota data changed, rescan scheduled\n"); + memset(&args, 0, sizeof(args)); + ret = ioctl(fd, BTRFS_IOC_QUOTA_RESCAN, &args); + if (ret < 0) + fprintf(stderr, + "ERROR: quota rescan failed: %s\n", + strerror(errno)); + } else { + printf("WARNING: quotas may be inconsistent, rescan needed\n"); + } } close_file_or_dir(fd, dirstream); return ret; @@ -179,8 +205,11 @@ static int parse_limit(const char *p, unsigned long long *s) } static const char * const cmd_qgroup_assign_usage[] = { - "btrfs qgroup assign ", + "btrfs qgroup assign [options] ", "Enable subvolume qgroup support for a filesystem.", + "", + "--rescan schedule qutoa rescan if needed", + "--no-rescan ", NULL }; -- cgit v1.2.3