diff options
author | Qu Wenruo <quwenruo@cn.fujitsu.com> | 2015-02-27 16:26:39 +0800 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2015-08-31 19:25:11 +0200 |
commit | 62ae6b2bf25065461ddc2b49540a3f5052fe7e93 (patch) | |
tree | 72819fb6628d3f9db971eebe87912abb66382cf9 /cmds-qgroup.c | |
parent | 02abd61aa0566cde9e3a324cb207241e2259564d (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.c | 24 |
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) |