summaryrefslogtreecommitdiff
path: root/cmds-qgroup.c
diff options
context:
space:
mode:
authorQu Wenruo <quwenruo@cn.fujitsu.com>2015-02-27 16:26:39 +0800
committerDavid Sterba <dsterba@suse.com>2015-08-31 19:25:11 +0200
commit62ae6b2bf25065461ddc2b49540a3f5052fe7e93 (patch)
tree72819fb6628d3f9db971eebe87912abb66382cf9 /cmds-qgroup.c
parent02abd61aa0566cde9e3a324cb207241e2259564d (diff)
btrfs-progs: Schedule quota rescan if qgroup assign caused inconsistence.
NOTE: This patch needs to cooperate with kernel patches, which will fix a kernel bug that never clear INCONSISTENT bit and return 1 if quota assign makes qgroup data inconsistent. Some qgroup assign will cause qgroup data inconsistent, like remove a qgroup with shared extents from a parent qgroup. But some won't, like assign a empty(OK, nodesize rfer and exel) to a qgroup. Newer kernel will return 1 if qgroup data inconsistent and in that case we should schedule a quota rescan. This patch will do this in btrfs-progs. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'cmds-qgroup.c')
-rw-r--r--cmds-qgroup.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/cmds-qgroup.c b/cmds-qgroup.c
index 9a7de34e..6436e9c6 100644
--- a/cmds-qgroup.c
+++ b/cmds-qgroup.c
@@ -64,13 +64,33 @@ static int qgroup_assign(int assign, int argc, char **argv)
ret = ioctl(fd, BTRFS_IOC_QGROUP_ASSIGN, &args);
e = errno;
- close_file_or_dir(fd, dirstream);
if (ret < 0) {
fprintf(stderr, "ERROR: unable to assign quota group: %s\n",
strerror(e));
+ close_file_or_dir(fd, dirstream);
return 1;
}
- return 0;
+
+ /*
+ * If ret > 0, it means assign caused qgroup data inconsistent state.
+ * Schedule a quota rescan if requested.
+ *
+ * The return value change only happens in newer kernel. But will not
+ * cause problem since old kernel has a bug that will never clear
+ * 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));
+ }
+ close_file_or_dir(fd, dirstream);
+ return ret;
}
static int qgroup_create(int create, int argc, char **argv)