#include "commands.h"
#include "utils.h"
+#include "help.h"
static const char * const quota_cmd_group_usage[] = {
"btrfs quota <command> [options] <path>",
{
int ret = 0;
int fd;
- int e;
char *path = argv[1];
struct btrfs_ioctl_quota_ctl_args args;
DIR *dirstream = NULL;
return 1;
ret = ioctl(fd, BTRFS_IOC_QUOTA_CTL, &args);
- e = errno;
close_file_or_dir(fd, dirstream);
if (ret < 0) {
- error("quota command failed: %s", strerror(e));
+ error("quota command failed: %m");
return 1;
}
return 0;
DIR *dirstream = NULL;
int wait_for_completion = 0;
- optind = 1;
while (1) {
int c = getopt(argc, argv, "sw");
if (c < 0)
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) {
- error("quota rescan failed: %s", strerror(e));
+ error("could not obtain quota rescan status: %m");
return 1;
- } else {
- printf("quota rescan started\n");
}
- } 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: %m");
+ 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: %m");
+ close_file_or_dir(fd, dirstream);
+ return 1;
}
}
+ close_file_or_dir(fd, dirstream);
return 0;
}