btrfs-progs: qgroup: add sync option to 'qgroup show'

The 'qgroup show' command does not synchronize filesystem.
Therefore, 'qgroup show' may not display the correct value unless
synchronized with 'filesystem sync' command etc.

So add the '--sync' option so that we can choose whether or not
to synchronize when executing the command.

Signed-off-by: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
master
Tsutomu Itoh 2016-12-15 13:29:28 +09:00 committed by David Sterba
parent 6b62b76470
commit bd1ac1fb1d
2 changed files with 24 additions and 2 deletions

View File

@ -126,6 +126,10 @@ Prefix \'+' means ascending order and \'-' means descending order of <attr>.
If no prefix is given, use ascending order by default.
+
If multiple <attr>s is given, use comma to separate.
+
--sync::::
To retrieve information after updating the state of qgroups,
force sync of the filesystem identified by <path> before getting information.
EXIT STATUS
-----------

View File

@ -272,8 +272,7 @@ static int cmd_qgroup_destroy(int argc, char **argv)
}
static const char * const cmd_qgroup_show_usage[] = {
"btrfs qgroup show -pcreFf "
"[--sort=qgroupid,rfer,excl,max_rfer,max_excl] <path>",
"btrfs qgroup show [options] <path>",
"Show subvolume quota groups.",
"-p print parent qgroup id",
"-c print child qgroup id",
@ -288,6 +287,7 @@ static const char * const cmd_qgroup_show_usage[] = {
" list qgroups sorted by specified items",
" you can use '+' or '-' in front of each item.",
" (+:ascending, -:descending, ascending default)",
"--sync force sync of the filesystem before getting info",
NULL
};
@ -300,6 +300,7 @@ static int cmd_qgroup_show(int argc, char **argv)
u64 qgroupid;
int filter_flag = 0;
unsigned unit_mode;
int sync = 0;
struct btrfs_qgroup_comparer_set *comparer_set;
struct btrfs_qgroup_filter_set *filter_set;
@ -310,8 +311,12 @@ static int cmd_qgroup_show(int argc, char **argv)
while (1) {
int c;
enum {
GETOPT_VAL_SYNC = 256
};
static const struct option long_options[] = {
{"sort", required_argument, NULL, 'S'},
{"sync", no_argument, NULL, GETOPT_VAL_SYNC},
{ NULL, 0, NULL, 0 }
};
@ -347,6 +352,9 @@ static int cmd_qgroup_show(int argc, char **argv)
if (ret)
usage(cmd_qgroup_show_usage);
break;
case GETOPT_VAL_SYNC:
sync = 1;
break;
default:
usage(cmd_qgroup_show_usage);
}
@ -364,6 +372,16 @@ static int cmd_qgroup_show(int argc, char **argv)
return 1;
}
if (sync) {
ret = ioctl(fd, BTRFS_IOC_SYNC);
if (ret < 0) {
error("sync ioctl failed on '%s': %s", path,
strerror(errno));
close_file_or_dir(fd, dirstream);
goto out;
}
}
if (filter_flag) {
ret = lookup_path_rootid(fd, &qgroupid);
if (ret < 0) {