Whamcloud - gitweb
LU-3943 utils: fix lfs df -i summary line
[fs/lustre-release.git] / lustre / utils / lfs.c
index f1021a3..a51ba82 100644 (file)
@@ -155,14 +155,19 @@ command_t cmdlist[] = {
         "                 <directory|filename> ..."},
        {"setdirstripe", lfs_setdirstripe, 0,
         "To create a remote directory on a specified MDT.\n"
-        "usage: setdirstripe <--index|-i mdt_index> <dir>\n"
-        "\tmdt_index:    MDT index of first stripe\n"},
+        "usage: setdirstripe <--count|-c stripe_count>\n"
+        "[--index|-i mdt_index] [--hash-type|-t hash_type]\n"
+        "[--default_stripe|-D ] <dir>\n"
+        "\tstripe_count: stripe count of the striped directory\n"
+        "\tmdt_index:  MDT index of first stripe\n"
+        "\thash_type:  hash type of the striped directory\n"
+        "\tdefault_stripe: set default dirstripe of the directory\n"},
        {"getdirstripe", lfs_getdirstripe, 0,
         "To list the striping info for a given directory\n"
         "or recursively for all directories in a directory tree.\n"
         "usage: getdirstripe [--obd|-O <uuid>] [--quiet|-q] [--verbose|-v]\n"
         "               [--count|-c ] [--index|-i ] [--raw|-R]\n"
-        "               [--recursive | -r] <dir> ..."},
+        "               [--recursive | -r] [ --default_stripe | -D ] <dir> "},
        {"mkdir", lfs_setdirstripe, 0,
         "To create a remote directory on a specified MDT. And this can only\n"
         "be done on MDT0 by administrator.\n"
@@ -1236,6 +1241,7 @@ static int lfs_getstripe_internal(int argc, char **argv,
                {"stripe-count",        no_argument,            0, 'c'},
                {"stripe_count",        no_argument,            0, 'c'},
                {"directory",           no_argument,            0, 'd'},
+               {"default",             no_argument,            0, 'D'},
                {"generation",          no_argument,            0, 'g'},
 #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 53, 0)
                /* This formerly implied "stripe-index", but was explicitly
@@ -1275,7 +1281,7 @@ static int lfs_getstripe_internal(int argc, char **argv,
 
        param->maxdepth = 1;
        optind = 0;
-       while ((c = getopt_long(argc, argv, "cdghiLMoO:pqrRsSv",
+       while ((c = getopt_long(argc, argv, "cdDghiLMoO:pqrRsSv",
                                long_opts, NULL)) != -1) {
                switch (c) {
                case 'O':
@@ -1293,6 +1299,9 @@ static int lfs_getstripe_internal(int argc, char **argv,
                case 'd':
                        param->maxdepth = 0;
                        break;
+               case 'D':
+                       param->get_default_lmv = 1;
+                       break;
                case 'r':
                        param->recursive = 1;
                        break;
@@ -1447,30 +1456,44 @@ static int lfs_getdirstripe(int argc, char **argv)
 /* functions */
 static int lfs_setdirstripe(int argc, char **argv)
 {
-       char *dname;
-       int result;
-       int  st_offset, st_count;
-       char *end;
-       int c;
-       char *stripe_off_arg = NULL;
-       int  flags = 0;
+       char                    *dname;
+       int                     result;
+       unsigned int            stripe_offset = -1;
+       unsigned int            stripe_count = 1;
+       enum lmv_hash_type      hash_type;
+       char                    *end;
+       int                     c;
+       char                    *stripe_offset_opt = NULL;
+       char                    *stripe_count_opt = NULL;
+       char                    *stripe_hash_opt = NULL;
+       int                     default_stripe = 0;
 
        struct option long_opts[] = {
-               {"index",    required_argument, 0, 'i'},
+               {"count",       required_argument, 0, 'c'},
+               {"index",       required_argument, 0, 'i'},
+               {"hash-type",   required_argument, 0, 't'},
+               {"default_stripe", required_argument, 0, 'D'},
                {0, 0, 0, 0}
        };
 
-       st_offset = -1;
-       st_count = 1;
        optind = 0;
-       while ((c = getopt_long(argc, argv, "i:o",
-                               long_opts, NULL)) >= 0) {
+
+       while ((c = getopt_long(argc, argv, "c:Di:t:", long_opts, NULL)) >= 0) {
                switch (c) {
                case 0:
                        /* Long options. */
                        break;
+               case 'c':
+                       stripe_count_opt = optarg;
+                       break;
+               case 'D':
+                       default_stripe = 1;
+                       break;
                case 'i':
-                       stripe_off_arg = optarg;
+                       stripe_offset_opt = optarg;
+                       break;
+               case 't':
+                       stripe_hash_opt = optarg;
                        break;
                default:
                        fprintf(stderr, "error: %s: option '%s' "
@@ -1486,22 +1509,55 @@ static int lfs_setdirstripe(int argc, char **argv)
                return CMD_HELP;
        }
 
-       dname = argv[optind];
-       if (stripe_off_arg == NULL) {
-               fprintf(stderr, "error: %s: missing stripe_off.\n",
+       if (stripe_offset_opt == NULL && stripe_count_opt == NULL) {
+               fprintf(stderr, "error: %s: missing stripe offset and count.\n",
                        argv[0]);
                return CMD_HELP;
        }
-       /* get the stripe offset */
-       st_offset = strtoul(stripe_off_arg, &end, 0);
-       if (*end != '\0') {
-               fprintf(stderr, "error: %s: bad stripe offset '%s'\n",
-                       argv[0], stripe_off_arg);
+
+       if (stripe_offset_opt != NULL) {
+               /* get the stripe offset */
+               stripe_offset = strtoul(stripe_offset_opt, &end, 0);
+               if (*end != '\0') {
+                       fprintf(stderr, "error: %s: bad stripe offset '%s'\n",
+                               argv[0], stripe_offset_opt);
+                       return CMD_HELP;
+               }
+       }
+
+       if (stripe_hash_opt == NULL ||
+           strcmp(stripe_hash_opt, LMV_HASH_NAME_FNV_1A_64) == 0) {
+               hash_type = LMV_HASH_TYPE_FNV_1A_64;
+       } else if (strcmp(stripe_hash_opt, LMV_HASH_NAME_ALL_CHARS) == 0) {
+               hash_type = LMV_HASH_TYPE_ALL_CHARS;
+       } else {
+               fprintf(stderr, "error: %s: bad stripe hash type '%s'\n",
+                       argv[0], stripe_hash_opt);
                return CMD_HELP;
        }
+
+       /* get the stripe count */
+       if (stripe_count_opt != NULL) {
+               stripe_count = strtoul(stripe_count_opt, &end, 0);
+               if (*end != '\0') {
+                       fprintf(stderr, "error: %s: bad stripe count '%s'\n",
+                               argv[0], stripe_count_opt);
+                       return CMD_HELP;
+               }
+       }
+
+       dname = argv[optind];
        do {
-               result = llapi_dir_create_pool(dname, flags, st_offset,
-                                              st_count, 0, NULL);
+               if (default_stripe == 1) {
+                       result = llapi_dir_set_default_lmv_stripe(dname,
+                                                   stripe_offset, stripe_count,
+                                                   hash_type, NULL);
+               } else {
+                       result = llapi_dir_create_pool(dname, 0, stripe_offset,
+                                                      stripe_count, hash_type,
+                                                      NULL);
+               }
+
                if (result) {
                        fprintf(stderr, "error: %s: create stripe dir '%s' "
                                "failed\n", argv[0], dname);
@@ -1655,16 +1711,17 @@ struct ll_stat_type {
 static int mntdf(char *mntdir, char *fsname, char *pool, int ishow,
                int cooked, int lazy)
 {
-        struct obd_statfs stat_buf, sum = { .os_bsize = 1 };
-        struct obd_uuid uuid_buf;
-        char *poolname = NULL;
-        struct ll_stat_type types[] = { { LL_STATFS_LMV, "MDT" },
-                                        { LL_STATFS_LOV, "OST" },
-                                        { 0, NULL } };
-        struct ll_stat_type *tp;
-        __u32 index;
-        __u32 type;
-        int rc;
+       struct obd_statfs stat_buf, sum = { .os_bsize = 1 };
+       struct obd_uuid uuid_buf;
+       char *poolname = NULL;
+       struct ll_stat_type types[] = { { LL_STATFS_LMV, "MDT" },
+                                       { LL_STATFS_LOV, "OST" },
+                                       { 0, NULL } };
+       struct ll_stat_type *tp;
+       __u64 ost_ffree = 0;
+       __u32 index;
+       __u32 type;
+       int rc;
 
         if (pool) {
                 poolname = strchr(pool, '.');
@@ -1718,23 +1775,32 @@ static int mntdf(char *mntdir, char *fsname, char *pool, int ishow,
                                         sum.os_ffree += stat_buf.os_ffree;
                                         sum.os_files += stat_buf.os_files;
                                 } else /* if (tp->st_op == LL_STATFS_LOV) */ {
-                                        sum.os_blocks += stat_buf.os_blocks *
-                                                stat_buf.os_bsize;
-                                        sum.os_bfree  += stat_buf.os_bfree *
-                                                stat_buf.os_bsize;
-                                        sum.os_bavail += stat_buf.os_bavail *
-                                                stat_buf.os_bsize;
-                                }
-                        } else if (rc == -EINVAL || rc == -EFAULT) {
-                                break;
-                        }
-                }
-        }
+                                       sum.os_blocks += stat_buf.os_blocks *
+                                               stat_buf.os_bsize;
+                                       sum.os_bfree  += stat_buf.os_bfree *
+                                               stat_buf.os_bsize;
+                                       sum.os_bavail += stat_buf.os_bavail *
+                                               stat_buf.os_bsize;
+                                       ost_ffree += stat_buf.os_ffree;
+                               }
+                       } else if (rc == -EINVAL || rc == -EFAULT) {
+                               break;
+                       }
+               }
+       }
 
-        printf("\n");
-        showdf(mntdir, &sum, "filesystem summary:", ishow, cooked, NULL, 0,0);
-        printf("\n");
-        return 0;
+       /* If we don't have as many objects free on the OST as inodes
+        * on the MDS, we reduce the total number of inodes to
+        * compensate, so that the "inodes in use" number is correct.
+        * Matches ll_statfs_internal() so the results are consistent. */
+       if (ost_ffree < sum.os_ffree) {
+               sum.os_files = (sum.os_files - sum.os_ffree) + ost_ffree;
+               sum.os_ffree = ost_ffree;
+       }
+       printf("\n");
+       showdf(mntdir, &sum, "filesystem summary:", ishow, cooked, NULL, 0, 0);
+       printf("\n");
+       return 0;
 }
 
 static int lfs_df(int argc, char **argv)