Btrfs-progs: enhance btrfs qgroup to print the result as a table
[platform/upstream/btrfs-progs.git] / cmds-qgroup.c
index 7c6c917..4fe776c 100644 (file)
@@ -202,7 +202,8 @@ static int cmd_qgroup_destroy(int argc, char **argv)
 }
 
 static const char * const cmd_qgroup_show_usage[] = {
-       "btrfs qgroup show -pcreF <path>",
+       "btrfs qgroup show -pcreFf "
+       "[--sort=qgroupid,rfer,excl,max_rfer,max_excl] <path>",
        "Show subvolume quota groups.",
        "-p             print parent qgroup id",
        "-c             print child qgroup id",
@@ -210,6 +211,13 @@ static const char * const cmd_qgroup_show_usage[] = {
        "-e             print max exclusive size of qgroup",
        "-F             list all qgroups which impact the given path"
        "(include ancestral qgroups)",
+       "-f             list all qgroups which impact the given path"
+       "(exclude ancestral qgroups)",
+       "--sort=qgroupid,rfer,excl,max_rfer,max_excl",
+       "               list qgroups in order of qgroupid,"
+       "rfer,max_rfer or max_excl",
+       "               you can use '+' or '-' in front of each item.",
+       "               (+:ascending, -:descending, ascending default)",
        NULL
 };
 
@@ -224,12 +232,19 @@ static int cmd_qgroup_show(int argc, char **argv)
        u64 qgroupid;
        int filter_flag = 0;
 
+       struct btrfs_qgroup_comparer_set *comparer_set;
        struct btrfs_qgroup_filter_set *filter_set;
        filter_set = btrfs_qgroup_alloc_filter_set();
+       comparer_set = btrfs_qgroup_alloc_comparer_set();
+       struct option long_options[] = {
+               {"sort", 1, NULL, 'S'},
+               {0, 0, 0, 0}
+       };
 
        optind = 1;
        while (1) {
-               c = getopt(argc, argv, "pcreF");
+               c = getopt_long(argc, argv, "pcreFf",
+                               long_options, NULL);
                if (c < 0)
                        break;
                switch (c) {
@@ -252,6 +267,15 @@ static int cmd_qgroup_show(int argc, char **argv)
                case 'F':
                        filter_flag |= 0x1;
                        break;
+               case 'f':
+                       filter_flag |= 0x2;
+                       break;
+               case 'S':
+                       ret = btrfs_qgroup_parse_sort_string(optarg,
+                                                            &comparer_set);
+                       if (ret)
+                               usage(cmd_qgroup_show_usage);
+                       break;
                default:
                        usage(cmd_qgroup_show_usage);
                }
@@ -268,11 +292,16 @@ static int cmd_qgroup_show(int argc, char **argv)
 
        if (filter_flag) {
                qgroupid = btrfs_get_path_rootid(fd);
-               btrfs_qgroup_setup_filter(&filter_set,
-                               BTRFS_QGROUP_FILTER_ALL_PARENT,
-                               qgroupid);
+               if (filter_flag & 0x1)
+                       btrfs_qgroup_setup_filter(&filter_set,
+                                       BTRFS_QGROUP_FILTER_ALL_PARENT,
+                                       qgroupid);
+               if (filter_flag & 0x2)
+                       btrfs_qgroup_setup_filter(&filter_set,
+                                       BTRFS_QGROUP_FILTER_PARENT,
+                                       qgroupid);
        }
-       ret = btrfs_show_qgroups(fd, filter_set);
+       ret = btrfs_show_qgroups(fd, filter_set, comparer_set);
        e = errno;
        close_file_or_dir(fd, dirstream);
        if (ret < 0)