X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Flfs.c;h=0ae49c397c0d4f4914d945751efe3236dd926f3c;hb=1e7158d15ed8adad0e8d94cb61bf889c0adcd825;hp=885c9b7994b74d5d2ee5f4a704fefa0d28200931;hpb=14171e787dd00902af7c9edf10a6b54aab45f7b2;p=fs%2Flustre-release.git diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index 885c9b7..0ae49c3 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -234,28 +234,28 @@ static inline int lfs_mirror_split(int argc, char **argv) #define MIGRATE_USAGE \ SSM_CMD_COMMON("migrate ") \ - " [--block|-b]\n" \ - " [--non-block|-n]\n" \ - " [--non-direct|-D]\n" \ + " [--block|-b] [--non-block|-n]\n" \ + " [--non-direct|-D] [--verbose|-v]\n" \ " \n" \ SSM_HELP_COMMON \ "\n" \ "\tblock: Block file access during data migration (default)\n" \ "\tnon-block: Abort migrations if concurrent access is detected\n" \ - "\tnon-direct: Do not use direct I/O to copy file contents\n" \ + "\tnon-direct: Do not use direct I/O to copy file contents\n" \ + "\tverbose: Print each filename as it is migrated\n" \ #define SETDIRSTRIPE_USAGE \ " [--mdt-count|-c stripe_count>\n" \ - " [--mdt-index|-i mdt_index[,mdt_index,...]\n" \ " [--mdt-hash|-H mdt_hash]\n" \ - " [--default|-D] [--mode|-m mode] \n" \ + " [--mdt-index|-i mdt_index[,mdt_index,...]\n" \ + " [--default|-D] [--mode|-o mode] \n" \ "\tstripe_count: stripe count of the striped directory\n" \ "\tmdt_index: MDT index of first stripe\n" \ "\tmdt_hash: hash type of the striped directory. mdt types:\n" \ " fnv_1a_64 FNV-1a hash algorithm (default)\n" \ " all_char sum of characters % MDT_COUNT (not recommended)\n" \ "\tdefault_stripe: set default dirstripe of the directory\n" \ - "\tmode: the mode of the directory\n" + "\tmode: the file access permission of the directory (octal)\n" /** * command_t mirror_cmdlist - lfs mirror commands. @@ -383,7 +383,6 @@ command_t cmdlist[] = { "usage: find ...\n" " [[!] --atime|-A [+-]N] [[!] --ctime|-C [+-]N]\n" " [[!] --mtime|-M [+-]N] [--maxdepth|-D N] [[!] --blocks|-b N]\n" - " [[!] --mdt-index|--mdt|-m ]\n" " [[!] --name|-n ] [[!] --ost|-O ]\n" " [--print|-P] [--print0|-0] [[!] --size|-s [+-]N[bkMGTPE]]\n" " [[!] --stripe-count|-c [+-]]\n" @@ -401,6 +400,7 @@ command_t cmdlist[] = { " [[!] --mirror-state <[^]state>]\n" " [[!] --mdt-count|-T [+-]]\n" " [[!] --mdt-hash|-H \n" + " [[!] --mdt-index|-m ]\n" "\t !: used before an option indicates 'NOT' requested attribute\n" "\t -: used before a value indicates less than requested value\n" "\t +: used before a value indicates more than requested value\n" @@ -408,9 +408,9 @@ command_t cmdlist[] = { "\t fnv_1a_64 FNV-1a hash algorithm\n" "\t all_char sum of characters % MDT_COUNT\n"}, {"check", lfs_check, 0, - "Display the status of MDS or OSTs (as specified in the command)\n" - "or all the servers (MDS and OSTs).\n" - "usage: check "}, + "Display the status of MGTs, MDTs or OSTs (as specified in the command)\n" + "or all the servers (MGTs, MDTs and OSTs).\n" + "usage: check "}, {"osts", lfs_osts, 0, "list OSTs connected to client " "[for specified path only]\n" "usage: osts [path]"}, {"mdts", lfs_mdts, 0, "list MDTs connected to client " @@ -541,9 +541,9 @@ command_t cmdlist[] = { "usage: swap_layouts "}, {"migrate", lfs_setstripe_migrate, 0, "migrate a directory between MDTs.\n" - "usage: migrate [--mdt|-m] \n" - " [--mdt-count|-c] \n" + "usage: migrate [--mdt-count|-c] \n" " [--mdt-hash|-H] \n" + " [--mdt-index|-m] \n" " [--verbose|-v]\n" " \n" "\tmdt: MDTs to stripe over, if only one MDT is specified\n" @@ -570,8 +570,8 @@ command_t cmdlist[] = { "\tstripe_size: number of bytes to store before moving to the next OST\n" "\tpool_name: name of the predefined pool of OSTs\n" "\tost_indices: OSTs to stripe over, in order\n" - "\tblock: wait for the operation to return before continuing\n" - "\tnon-block: do not wait for the operation to return\n" + "\tblock: Block file access during data migration (default)\n" + "\tnon-block: Abort migrations if concurrent access is detected\n" "\tnon-direct: do not use direct I/O to copy file contents.\n"}, {"mv", lfs_mv, 0, "To move directories between MDTs. This command is deprecated, " @@ -625,9 +625,10 @@ static int check_hashtype(const char *hashtype) static const char *error_loc = "syserror"; enum { - MIGRATION_NONBLOCK = 1 << 0, - MIGRATION_MIRROR = 1 << 1, - MIGRATION_NONDIRECT = 1 << 2, + MIGRATION_NONBLOCK = 0x0001, + MIGRATION_MIRROR = 0x0002, + MIGRATION_NONDIRECT = 0x0004, + MIGRATION_VERBOSE = 0x0008, }; static int lfs_component_create(char *fname, int open_flags, mode_t open_mode, @@ -1129,6 +1130,9 @@ out: if (rc < 0) fprintf(stderr, "error: %s: %s: %s: %s\n", progname, name, error_loc, strerror(-rc)); + else if (migration_flags & MIGRATION_VERBOSE) + printf("%s\n", name); + return rc; } @@ -2286,6 +2290,16 @@ static int build_layout_from_yaml_node(struct cYAML *node, } else if (!strcmp(string, "pattern")) { if (!strcmp(node->cy_valuestring, "mdt")) lsa->lsa_pattern = LLAPI_LAYOUT_MDT; + } else if (!strcmp(string, "lcme_flags")) { + rc = comp_str2flags(node->cy_valuestring, + &lsa->lsa_comp_flags, + &lsa->lsa_comp_neg_flags); + if (rc) + return rc; + /* Only template flags have meaning in + * the layout for a new file + */ + lsa->lsa_comp_flags &= LCME_TEMPLATE_FLAGS; } } else if (node->cy_type == CYAML_TYPE_NUMBER) { if (!strcmp(string, "lcm_mirror_count")) { @@ -2906,7 +2920,7 @@ static int lfs_setstripe_internal(int argc, char **argv, case 'm': if (!migrate_mode) { fprintf(stderr, - "%s %s: -m|--mdt is valid only for migrate command\n", + "%s %s: -m|--mdt-index is valid only for migrate command\n", progname, argv[0]); goto usage_error; } @@ -3024,6 +3038,7 @@ static int lfs_setstripe_internal(int argc, char **argv, goto usage_error; } migrate_mdt_param.fp_verbose = VERBOSE_DETAIL; + migration_flags = MIGRATION_VERBOSE; break; case 'y': from_yaml = true; @@ -4606,16 +4621,22 @@ enum mntdf_flags { #define RSF "%4s" #define RDF "%3d%%" -static inline int obd_statfs_ratio(const struct obd_statfs *st) +static inline int obd_statfs_ratio(const struct obd_statfs *st, bool inodes) { double avail, used, ratio = 0; - avail = st->os_bavail; - used = st->os_blocks - st->os_bfree; + if (inodes) { + avail = st->os_ffree; + used = st->os_files - st->os_ffree; + } else { + avail = st->os_bavail; + used = st->os_blocks - st->os_bfree; + } if (avail + used > 0) - ratio = used / (used + avail) * 100 + 0.5; + ratio = used / (used + avail) * 100; - return (int)ratio; + /* Round up to match df(1) usage percentage */ + return (ratio - (int)ratio) > 0 ? (int)(ratio + 1) : (int)ratio; } static int showdf(char *mntdir, struct obd_statfs *stat, @@ -4649,7 +4670,7 @@ static int showdf(char *mntdir, struct obd_statfs *stat, total = (stat->os_blocks * stat->os_bsize) >> shift; } - ratio = obd_statfs_ratio(stat); + ratio = obd_statfs_ratio(stat, flags & MNTDF_INODES); if (flags & MNTDF_COOKED) { int i; @@ -4893,8 +4914,8 @@ static int ll_statfs_data_comp(const void *sd1, const void *sd2) sd_st; const struct obd_statfs *st2 = &((const struct ll_statfs_data *)sd2)-> sd_st; - int r1 = obd_statfs_ratio(st1); - int r2 = obd_statfs_ratio(st2); + int r1 = obd_statfs_ratio(st1, false); + int r2 = obd_statfs_ratio(st2, false); int64_t result = r1 - r2; /* if both space usage are above 90, compare free inodes */ @@ -4935,7 +4956,13 @@ static int lfs_setdirstripe(int argc, char **argv) { .val = 'D', .name = "default", .has_arg = no_argument }, { .val = 'D', .name = "default_stripe", .has_arg = no_argument }, { .val = 'H', .name = "mdt-hash", .has_arg = required_argument }, +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 17, 53, 0) { .val = 'i', .name = "mdt-index", .has_arg = required_argument }, + { .val = 'i', .name = "mdt", .has_arg = required_argument }, +#else + { .val = 'm', .name = "mdt-index", .has_arg = required_argument }, + { .val = 'm', .name = "mdt", .has_arg = required_argument }, +#endif #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) { .val = 'i', .name = "index", .has_arg = required_argument }, #endif @@ -4987,6 +5014,11 @@ static int lfs_setdirstripe(int argc, char **argv) } break; case 'i': +#if LUSTRE_VERSION_CODE >= OBD_OCD_VERSION(2, 17, 53, 0) + case 'm': +#endif + fprintf(stderr, "warning: '-m' is deprecated, " + "use '--mode' or '-o' instead\n"); #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) if (strcmp(argv[optind - 1], "--index") == 0) fprintf(stderr, @@ -5007,7 +5039,7 @@ static int lfs_setdirstripe(int argc, char **argv) if (lsa.lsa_stripe_off == LLAPI_LAYOUT_DEFAULT) lsa.lsa_stripe_off = mdts[0]; break; -#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 16, 53, 0) +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 15, 53, 0) case 'm': fprintf(stderr, "warning: '-m' is deprecated, " "use '--mode' or '-o' instead\n"); @@ -5174,8 +5206,8 @@ static int lfs_setdirstripe(int argc, char **argv) /* don't use server whose usage is above 90% */ while (nr != param->lsp_stripe_count && - obd_statfs_ratio(&lsb->sb_buf[nr].sd_st) - > 90) + obd_statfs_ratio(&lsb->sb_buf[nr].sd_st, + false) > 90) nr = MAX(param->lsp_stripe_count, nr / 2); @@ -5252,6 +5284,7 @@ static int lfs_mv(int argc, char **argv) int c; int rc = 0; struct option long_opts[] = { + { .val = 'm', .name = "mdt", .has_arg = required_argument }, { .val = 'm', .name = "mdt-index", .has_arg = required_argument }, { .val = 'v', .name = "verbose", .has_arg = no_argument }, { .name = NULL } }; @@ -5414,12 +5447,13 @@ static int lfs_getname(int argc, char **argv) static int lfs_check(int argc, char **argv) { - int rc; - char mntdir[PATH_MAX] = {'\0'}; - int num_types = 1; - char *obd_types[2]; - char obd_type1[4]; - char obd_type2[4]; + char mntdir[PATH_MAX] = {'\0'}; + int num_types = 1; + char *obd_types[3]; + char obd_type1[4]; + char obd_type2[4]; + char obd_type3[4]; + int rc; if (argc != 2) { fprintf(stderr, "%s check: server type must be specified\n", @@ -5427,17 +5461,23 @@ static int lfs_check(int argc, char **argv) return CMD_HELP; } - obd_types[0] = obd_type1; - obd_types[1] = obd_type2; - - if (strcmp(argv[1], "osts") == 0) { - strcpy(obd_types[0], "osc"); - } else if (strcmp(argv[1], "mds") == 0) { - strcpy(obd_types[0], "mdc"); - } else if (strcmp(argv[1], "servers") == 0) { - num_types = 2; - strcpy(obd_types[0], "osc"); - strcpy(obd_types[1], "mdc"); + obd_types[0] = obd_type1; + obd_types[1] = obd_type2; + obd_types[2] = obd_type3; + + if (strcmp(argv[1], "osts") == 0) { + strcpy(obd_types[0], "osc"); + } else if (strcmp(argv[1], "mdts") == 0 || + strcmp(argv[1], "mds") == 0) { + strcpy(obd_types[0], "mdc"); + } else if (strcmp(argv[1], "mgts") == 0) { + strcpy(obd_types[0], "mgc"); + } else if (strcmp(argv[1], "all") == 0 || + strcmp(argv[1], "servers") == 0) { + num_types = 3; + strcpy(obd_types[0], "osc"); + strcpy(obd_types[1], "mdc"); + strcpy(obd_types[2], "mgc"); } else { fprintf(stderr, "%s check: unrecognized option '%s'\n", progname, argv[1]); @@ -9447,8 +9487,9 @@ static int lfs_getsom(int argc, char **argv) attrs = (void *)buf; rc = lgetxattr(path, "trusted.som", attrs, sizeof(buf)); if (rc < 0) { - fprintf(stderr, "%s failed to get som xattr: %s\n", argv[0], - strerror(-rc)); + rc = -errno; + fprintf(stderr, "%s failed to get som xattr: %s (%d)\n", + argv[0], strerror(errno), errno); return rc; } @@ -9474,7 +9515,7 @@ static int lfs_getsom(int argc, char **argv) return CMD_HELP; } - return rc; + return 0; } /**