X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=cmds-quota.c;h=15bd4b9355ebc93c27143bbc07d4daa1a3b9a7bc;hb=075580471e0f7435c52df486eb4354031337a7d3;hp=94e3a5c76cc3ee65515c677b60dce2ae7e02650d;hpb=c17a056f3841b2ebc024f5af7ed2c58279641d4b;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/cmds-quota.c b/cmds-quota.c index 94e3a5c..15bd4b9 100644 --- a/cmds-quota.c +++ b/cmds-quota.c @@ -24,6 +24,7 @@ #include "commands.h" #include "utils.h" +#include "help.h" static const char * const quota_cmd_group_usage[] = { "btrfs quota [options] ", @@ -45,19 +46,16 @@ static int quota_ctl(int cmd, int argc, char **argv) memset(&args, 0, sizeof(args)); args.cmd = cmd; - fd = open_file_or_dir(path, &dirstream); - if (fd < 0) { - fprintf(stderr, "ERROR: can't access '%s'\n", path); - return 12; - } + fd = btrfs_open_dir(path, &dirstream, 1); + if (fd < 0) + return 1; ret = ioctl(fd, BTRFS_IOC_QUOTA_CTL, &args); e = errno; close_file_or_dir(fd, dirstream); if (ret < 0) { - fprintf(stderr, "ERROR: quota command failed: %s\n", - strerror(e)); - return 30; + error("quota command failed: %s", strerror(e)); + return 1; } return 0; } @@ -73,7 +71,12 @@ static const char * const cmd_quota_enable_usage[] = { static int cmd_quota_enable(int argc, char **argv) { - int ret = quota_ctl(BTRFS_QUOTA_CTL_ENABLE, argc, argv); + int ret; + + clean_args_no_options(argc, argv, cmd_quota_enable_usage); + + ret = quota_ctl(BTRFS_QUOTA_CTL_ENABLE, argc, argv); + if (ret < 0) usage(cmd_quota_enable_usage); return ret; @@ -87,7 +90,12 @@ static const char * const cmd_quota_disable_usage[] = { static int cmd_quota_disable(int argc, char **argv) { - int ret = quota_ctl(BTRFS_QUOTA_CTL_DISABLE, argc, argv); + int ret; + + clean_args_no_options(argc, argv, cmd_quota_disable_usage); + + ret = quota_ctl(BTRFS_QUOTA_CTL_DISABLE, argc, argv); + if (ret < 0) usage(cmd_quota_disable_usage); return ret; @@ -109,11 +117,10 @@ static int cmd_quota_rescan(int argc, char **argv) int e; char *path = NULL; struct btrfs_ioctl_quota_rescan_args args; - int ioctlnum = BTRFS_IOC_QUOTA_RESCAN; + unsigned long ioctlnum = BTRFS_IOC_QUOTA_RESCAN; DIR *dirstream = NULL; int wait_for_completion = 0; - optind = 1; while (1) { int c = getopt(argc, argv, "sw"); if (c < 0) @@ -131,8 +138,8 @@ static int cmd_quota_rescan(int argc, char **argv) } if (ioctlnum != BTRFS_IOC_QUOTA_RESCAN && wait_for_completion) { - fprintf(stderr, "ERROR: -w cannot be used with -s\n"); - return 12; + error("switch -w cannot be used with -s"); + return 1; } if (check_argc_exact(argc - optind, 1)) @@ -141,43 +148,57 @@ static int cmd_quota_rescan(int argc, char **argv) memset(&args, 0, sizeof(args)); path = argv[optind]; - fd = open_file_or_dir(path, &dirstream); - if (fd < 0) { - fprintf(stderr, "ERROR: can't access '%s'\n", path); - return 12; - } + fd = btrfs_open_dir(path, &dirstream, 1); + if (fd < 0) + return 1; ret = ioctl(fd, ioctlnum, &args); e = errno; - if (wait_for_completion && (ret == 0 || e == EINPROGRESS)) { - ret = ioctl(fd, BTRFS_IOC_QUOTA_RESCAN_WAIT, &args); - e = errno; - } - close_file_or_dir(fd, dirstream); - - if (ioctlnum == BTRFS_IOC_QUOTA_RESCAN) { + if (ioctlnum == BTRFS_IOC_QUOTA_RESCAN_STATUS) { + close_file_or_dir(fd, dirstream); if (ret < 0) { - fprintf(stderr, "ERROR: quota rescan failed: " - "%s\n", strerror(e)); - return 30; - } else { - printf("quota rescan started\n"); + error("could not obtain quota rescan status: %s", + strerror(e)); + return 1; } - } else { - if (!args.flags) { + if (!args.flags) printf("no rescan operation in progress\n"); - } else { + else printf("rescan operation running (current key %lld)\n", args.progress); + return 0; + } + + if (ret == 0) { + printf("quota rescan started\n"); + fflush(stdout); + } else if (ret < 0 && (!wait_for_completion || e != EINPROGRESS)) { + error("quota rescan failed: %s", strerror(e)); + close_file_or_dir(fd, dirstream); + return 1; + } + + if (wait_for_completion) { + ret = ioctl(fd, BTRFS_IOC_QUOTA_RESCAN_WAIT, &args); + e = errno; + if (ret < 0) { + error("quota rescan wait failed: %s", + strerror(e)); + close_file_or_dir(fd, dirstream); + return 1; } } + close_file_or_dir(fd, dirstream); return 0; } +static const char quota_cmd_group_info[] = +"manage filesystem quota settings"; + const struct cmd_group quota_cmd_group = { - quota_cmd_group_usage, NULL, { + quota_cmd_group_usage, quota_cmd_group_info, { { "enable", cmd_quota_enable, cmd_quota_enable_usage, NULL, 0 }, { "disable", cmd_quota_disable, cmd_quota_disable_usage, NULL, 0 },