summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTsutomu Itoh <t-itoh@jp.fujitsu.com>2016-12-15 13:29:28 +0900
committerDavid Sterba <dsterba@suse.com>2017-01-25 09:48:33 +0100
commitbd1ac1fb1d33188eaa7834af215e78ab41166d7a (patch)
tree7f465de131f9e9b5554e731bb49d1c3db1aeb67f
parent6b62b7647041d1b42c8e899d6f104805b93dad49 (diff)
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>
-rw-r--r--Documentation/btrfs-qgroup.asciidoc4
-rw-r--r--cmds-qgroup.c22
2 files changed, 24 insertions, 2 deletions
diff --git a/Documentation/btrfs-qgroup.asciidoc b/Documentation/btrfs-qgroup.asciidoc
index 438dbc7d..3053f2e6 100644
--- a/Documentation/btrfs-qgroup.asciidoc
+++ b/Documentation/btrfs-qgroup.asciidoc
@@ -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
-----------
diff --git a/cmds-qgroup.c b/cmds-qgroup.c
index d0f10dd4..6f073099 100644
--- a/cmds-qgroup.c
+++ b/cmds-qgroup.c
@@ -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) {