At 12/07/2016 12:31 PM, Tsutomu Itoh wrote:
Hi Qu,

Thanks for the review.

On 2016/12/07 12:24, Qu Wenruo wrote:


At 12/07/2016 11:07 AM, Tsutomu Itoh wrote:
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' and '--no-sync' options so that we can choose
whether or not to synchronize when executing the command.

Indeed, --sync would help in a lot of cases.


Signed-off-by: Tsutomu Itoh <t-i...@jp.fujitsu.com>
---
 Documentation/btrfs-qgroup.asciidoc |  5 +++++
 cmds-qgroup.c                       | 24 ++++++++++++++++++++++--
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/Documentation/btrfs-qgroup.asciidoc 
b/Documentation/btrfs-qgroup.asciidoc
index 438dbc7..dd133ec 100644
--- a/Documentation/btrfs-qgroup.asciidoc
+++ b/Documentation/btrfs-qgroup.asciidoc
@@ -126,6 +126,11 @@ 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::::
+invoke sync before getting info.

A little more words would help, to info user that qgroup will only update after 
sync.

+--no-sync::::
+do not invoke sync before getting info (default).

 EXIT STATUS
 -----------
diff --git a/cmds-qgroup.c b/cmds-qgroup.c
index bc15077..ac339f3 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,8 @@ 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         invoke sync before getting info",
+    "--no-sync      do not invoke sync before getting info (default)",

I see you're using -Y and -N option, it's better also to show
the short option together, if we will use that short option.

Do you think that a short option is necessary?
I thought it was not necessary...

Just mean if we use short option in getopt, it's better to mention it in both man page and help string.



     NULL
 };

@@ -301,6 +302,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;
@@ -313,6 +315,8 @@ static int cmd_qgroup_show(int argc, char **argv)
         int c;
         static const struct option long_options[] = {
             {"sort", required_argument, NULL, 'S'},
+            {"sync", no_argument, NULL, 'Y'},
+            {"no-sync", no_argument, NULL, 'N'},

Although I'm not sure if "-Y" and "-N" is proper here.
IMHO, it's more like something to say all "Yes" or "No" to any interactive 
confirmation.

Maybe non-charactor option will be better.

Umm, these mean s(Y)nc/(N)osync, and the user can not specify short options...
Still would you rather change to another character?

If not using short option, it's better to use non-character value instead of 'Y' and 'N'.

Use any number larger than 256 would do the trick, just like we did in qgroup assign:

enum { GETOPT_VAL_RESCAN = 256, GETOPT_VAL_NO_RESCAN };
static const struct option long_options[] = {
        { "rescan", no_argument, NULL, GETOPT_VAL_RESCAN },
        { "no-rescan", no_argument, NULL, GETOPT_VAL_NO_RESCAN },
        { NULL, 0, NULL, 0 }
};
int c = getopt_long(argc, argv, "", long_options, NULL);

BTW, I'm completely OK not to use short option.
Just the "Y" and "N" a little confusing to me since they are not mentioned anywhere.

Thanks,
Qu

Thanks,
Tsutomu


Other part looks good to me.

Thanks,
Qu

             { NULL, 0, NULL, 0 }
         };

@@ -348,6 +352,12 @@ static int cmd_qgroup_show(int argc, char **argv)
             if (ret)
                 usage(cmd_qgroup_show_usage);
             break;
+        case 'Y':
+            sync = 1;
+            break;
+        case 'N':
+            sync = 0;
+            break;
         default:
             usage(cmd_qgroup_show_usage);
         }
@@ -365,6 +375,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) {



--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html





--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to