X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Flfs.c;h=a51ba82312fc564ab2e616b203784bc3dc7c985a;hp=f1021a320443b3d8b0dd76c3c4d4e0d05eae387c;hb=fbab51e0d0d83bf78b4619cab3a0a1495ffa294f;hpb=c9097033efe73e99767dccd43d10b3933f5f258e diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index f1021a3..a51ba82 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -155,14 +155,19 @@ command_t cmdlist[] = { " ..."}, {"setdirstripe", lfs_setdirstripe, 0, "To create a remote directory on a specified MDT.\n" - "usage: setdirstripe <--index|-i mdt_index> \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 ] \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 ] [--quiet|-q] [--verbose|-v]\n" " [--count|-c ] [--index|-i ] [--raw|-R]\n" - " [--recursive | -r] ..."}, + " [--recursive | -r] [ --default_stripe | -D ] "}, {"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)