summaryrefslogtreecommitdiff
path: root/cmds-quota.c
diff options
context:
space:
mode:
authorJeff Mahoney <jeffm@suse.com>2017-01-17 20:56:39 -0500
committerDavid Sterba <dsterba@suse.com>2017-01-25 09:48:09 +0100
commit795cfb9b1735c09f108c91f93b578203cd865163 (patch)
tree1aea7fa875505715d0f58d277ff1612c58d063ea /cmds-quota.c
parent1c5301a4b63c4bbc853ae6f764fe4f4e125b4a4b (diff)
btrfs-progs: quota: fix printing during wait mode
If we call "btrfs quota rescan -w", it will attempt to start the rescan operation, wait for it, and then print the "quota rescan started" message. The wait could last an arbitrary amount of time, so printing it after the wait isn't very helpful. This patch reworks how we print the rescan started message as well as the printing of the messages, including adding an error message for status query failures (which could be EPERM/EFAULT/ENOMEM, not just no rescan in progress) and wait failures. Signed-off-by: Jeff Mahoney <jeffm@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'cmds-quota.c')
-rw-r--r--cmds-quota.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/cmds-quota.c b/cmds-quota.c
index 75c032b1..f9b422dc 100644
--- a/cmds-quota.c
+++ b/cmds-quota.c
@@ -154,28 +154,42 @@ static int cmd_quota_rescan(int argc, char **argv)
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: %s",
+ strerror(e));
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: %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;
}