X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Flfs.c;h=89863fde8c6d18507af71e9fc1834d9184a9fdf3;hb=d61792d0f5fa1e313ec216a5dcb833381cbec92b;hp=7406999ed2e9d706ca6d47e9559a0176e6c0dd82;hpb=8bbbd4ea4f10a6d907ff0885d6c8334dacd748a6;p=fs%2Flustre-release.git diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index 7406999..89863fd 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -66,7 +66,7 @@ #include #include #include -#include +#include #ifndef ARRAY_SIZE # define ARRAY_SIZE(a) ((sizeof(a)) / (sizeof((a)[0]))) @@ -187,6 +187,7 @@ command_t cmdlist[] = { " \n" "\tcomp_id: Unique component ID\n" "\tcomp_flags: 'init' indicating all instantiated components\n" + "\t '^init' indicating all uninstantiated components\n" "\t-I and -F can't be specified at the same time\n" " or\n" "To add component(s) to an existing composite file:\n" @@ -202,11 +203,11 @@ command_t cmdlist[] = { " [--pool|-p] [--stripe-size|-S] [--directory|-d]\n" " [--mdt|-m] [--recursive|-r] [--raw|-R] [--yaml|-y]\n" " [--layout|-L] [--fid|-F] [--generation|-g]\n" - " [--component-id|-I [comp_id]]\n" - " [--component-flags [comp_flags]]\n" - " [--component-count [comp_count]]\n" - " [--component-start [comp_start]]\n" - " [--component-end|-E [comp_end]]\n" + " [--component-id[=comp_id]|-I[comp_id]]\n" + " [--component-flags[=comp_flags]]\n" + " [--component-count]\n" + " [--component-start[=[+-]comp_start]]\n" + " [--component-end[=[+-]comp_end]|-E[[+-]comp_end]]\n" " ..."}, {"setdirstripe", lfs_setdirstripe, 0, "To create a striped directory on a specified MDT. This can only\n" @@ -256,8 +257,8 @@ command_t cmdlist[] = { " [[!] --mdt-count|-T [+-]]\n" " [[!] --mdt-hash|-H \n" "\t !: used before an option indicates 'NOT' requested attribute\n" - "\t -: used before a value indicates 'AT MOST' requested value\n" - "\t +: used before a value indicates 'AT LEAST' requested value\n" + "\t -: used before a value indicates less than requested value\n" + "\t +: used before a value indicates more than requested value\n" "\tmdt-hash: hash type of the striped directory.\n" "\t fnv_1a_64 FNV-1a hash algorithm\n" "\t all_char sum of characters % MDT_COUNT\n"}, @@ -684,13 +685,12 @@ static int lfs_component_del(char *fname, __u32 comp_id, __u32 flags) fprintf(stderr, "Invalid component flags %#x\n", flags); return -EINVAL; } - comp_id = LCME_ID_NONE | flags; } else if (comp_id > LCME_ID_MAX) { fprintf(stderr, "Invalid component id %u\n", comp_id); return -EINVAL; } - rc = llapi_layout_file_comp_del(fname, comp_id); + rc = llapi_layout_file_comp_del(fname, comp_id, flags); if (rc) fprintf(stderr, "Delete component %#x from %s failed. %s\n", comp_id, fname, strerror(errno)); @@ -1011,42 +1011,19 @@ static int parse_targets(__u32 *osts, int size, int offset, char *arg) static int verify_pool_name(char *prog_name, char *pool_name) { - char *ptr; - int rc; + char *ptr; if (pool_name == NULL) return 0; ptr = strchr(pool_name, '.'); - if (ptr == NULL) { - ptr = pool_name; - } else { - if (ptr == pool_name) { - fprintf(stderr, "error: %s: fsname is empty " - "in pool name '%s'\n", - prog_name, pool_name); - return -EINVAL; - } - ++ptr; - } - - rc = lustre_is_poolname_valid(ptr, 1, LOV_MAXPOOLNAME); - if (rc == -1) { - fprintf(stderr, "error: %s: poolname '%s' is empty\n", + if (ptr != NULL && ptr == pool_name) { + fprintf(stderr, "error: %s: fsname is empty in pool name '%s'\n", prog_name, pool_name); return -EINVAL; - } else if (rc == -2) { - fprintf(stderr, "error: %s: pool name '%s' is too long " - "(max is %d characters)\n", - prog_name, pool_name, LOV_MAXPOOLNAME); - return -EINVAL; - } else if (rc > 0) { - fprintf(stderr, "error: %s: char '%c' not allowed in " - "pool name '%s'\n", - prog_name, rc, pool_name); - return -EINVAL; } - return rc; + + return 0; } struct lfs_setstripe_args { @@ -1183,14 +1160,30 @@ static int adjust_first_extent(char *fname, struct llapi_layout *layout) if (layout == NULL) return -EINVAL; + errno = 0; head = llapi_layout_get_by_path(fname, 0); if (head == NULL) { fprintf(stderr, "Read layout from %s failed. %s\n", fname, strerror(errno)); return -EINVAL; + } else if (errno == ENODATA) { + /* file without LOVEA, this component-add will be turned + * into a component-create. */ + llapi_layout_free(head); + return -ENODATA; + } else { + /* Current component of 'head' should be tail of component + * list by default, but we do an extra move cursor operation + * here to test if the layout is non-composite. */ + rc = llapi_layout_comp_use(head, LLAPI_LAYOUT_COMP_USE_LAST); + if (rc < 0) { + fprintf(stderr, "'%s' isn't a composite file?\n", + fname); + llapi_layout_free(head); + return rc; + } } - /* Current component of 'head' should be tail of component list. */ rc = llapi_layout_comp_extent_get(head, &start, &prev_end); if (rc) { fprintf(stderr, "Get prev extent failed. %s\n", @@ -1246,24 +1239,73 @@ static int adjust_first_extent(char *fname, struct llapi_layout *layout) return 0; } -static int comp_name2flags(__u32 *flags, char *name) +static inline bool comp_flags_is_neg(__u32 flags) { - char *ptr; + return flags & LCME_FL_NEG; +} + +static inline void comp_flags_set_neg(__u32 *flags) +{ + *flags |= LCME_FL_NEG; +} + +static inline void comp_flags_clear_neg(__u32 *flags) +{ + *flags &= ~LCME_FL_NEG; +} + +static int comp_str2flags(__u32 *flags, char *string) +{ + char *name; + __u32 neg_flags = 0; - if (name == NULL) + if (string == NULL) return -EINVAL; *flags = 0; - for (ptr = name; ; ptr = NULL) { - char *flg = strtok(ptr, ","); - if (flg == NULL) - break; - if (strcmp(flg, "init") == 0) - *flags |= LCME_FL_INIT; - else + for (name = strtok(string, ","); name; name = strtok(NULL, ",")) { + bool found = false; + int i; + + for (i = 0; i < ARRAY_SIZE(comp_flags_table); i++) { + __u32 comp_flag = comp_flags_table[i].cfn_flag; + const char *comp_name = comp_flags_table[i].cfn_name; + + if (strcmp(name, comp_name) == 0) { + *flags |= comp_flag; + found = true; + } else if (strncmp(name, "^", 1) == 0 && + strcmp(name + 1, comp_name) == 0) { + neg_flags |= comp_flag; + found = true; + } + } + if (!found) { + llapi_printf(LLAPI_MSG_ERROR, "Component flag " + "'%s' is not supported.\n", name); return -EINVAL; + } + } + + if (*flags == 0 && neg_flags == 0) + return -EINVAL; + /* don't support mixed flags for now */ + if (*flags && neg_flags) + return -EINVAL; + + if (neg_flags) { + *flags = neg_flags; + comp_flags_set_neg(flags); } - return (*flags == 0) ? -EINVAL : 0; + + return 0; +} + +static inline bool arg_is_eof(char *arg) +{ + return !strncmp(arg, "-1", strlen("-1")) || + !strncmp(arg, "EOF", strlen("EOF")) || + !strncmp(arg, "eof", strlen("eof")); } enum { @@ -1303,63 +1345,87 @@ static int lfs_setstripe(int argc, char **argv) __u32 comp_id = 0; struct llapi_layout *layout = NULL; - struct option long_opts[] = { + struct option long_opts[] = { /* --block is only valid in migrate mode */ - {"block", no_argument, 0, 'b'}, - {"comp-add", no_argument, 0, LFS_COMP_ADD_OPT}, - {"component-add", no_argument, 0, LFS_COMP_ADD_OPT}, - {"comp-del", no_argument, 0, LFS_COMP_DEL_OPT}, - {"component-del", no_argument, 0, LFS_COMP_DEL_OPT}, - {"comp-flags", required_argument, 0, LFS_COMP_FLAGS_OPT}, - {"component-flags", required_argument, 0, LFS_COMP_FLAGS_OPT}, - {"comp-set", no_argument, 0, LFS_COMP_SET_OPT}, - {"component-set", no_argument, 0, LFS_COMP_SET_OPT}, + { .val = 'b', .name = "block", .has_arg = no_argument}, + { .val = LFS_COMP_ADD_OPT, + .name = "comp-add", .has_arg = no_argument}, + { .val = LFS_COMP_ADD_OPT, + .name = "component-add", + .has_arg = no_argument}, + { .val = LFS_COMP_DEL_OPT, + .name = "comp-del", .has_arg = no_argument}, + { .val = LFS_COMP_DEL_OPT, + .name = "component-del", + .has_arg = no_argument}, + { .val = LFS_COMP_FLAGS_OPT, + .name = "comp-flags", .has_arg = required_argument}, + { .val = LFS_COMP_FLAGS_OPT, + .name = "component-flags", + .has_arg = required_argument}, + { .val = LFS_COMP_SET_OPT, + .name = "comp-set", .has_arg = no_argument}, + { .val = LFS_COMP_SET_OPT, + .name = "component-set", + .has_arg = no_argument}, #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0) - /* This formerly implied "stripe-count", but was explicitly - * made "stripe-count" for consistency with other options, - * and to separate it from "mdt-count" when DNE arrives. */ - {"count", required_argument, 0, 'c'}, + /* This formerly implied "stripe-count", but was explicitly + * made "stripe-count" for consistency with other options, + * and to separate it from "mdt-count" when DNE arrives. */ + { .val = 'c', .name = "count", .has_arg = required_argument }, #endif - {"stripe-count", required_argument, 0, 'c'}, - {"stripe_count", required_argument, 0, 'c'}, - {"delete", no_argument, 0, 'd'}, - {"comp-end", required_argument, 0, 'E'}, - {"component-end", required_argument, 0, 'E'}, - /* dirstripe {"mdt-hash", required_argument, 0, 'H'}, */ + { .val = 'c', .name = "stripe-count", .has_arg = required_argument}, + { .val = 'c', .name = "stripe_count", .has_arg = required_argument}, + { .val = 'd', .name = "delete", .has_arg = no_argument}, + { .val = 'E', .name = "comp-end", .has_arg = required_argument}, + { .val = 'E', .name = "component-end", + .has_arg = required_argument}, + /* dirstripe {"mdt-hash", required_argument, 0, 'H'}, */ #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0) - /* This formerly implied "stripe-index", but was explicitly - * made "stripe-index" for consistency with other options, - * and to separate it from "mdt-index" when DNE arrives. */ - {"index", required_argument, 0, 'i'}, + /* This formerly implied "stripe-index", but was explicitly + * made "stripe-index" for consistency with other options, + * and to separate it from "mdt-index" when DNE arrives. */ + { .val = 'i', .name = "index", .has_arg = required_argument }, #endif - {"stripe-index", required_argument, 0, 'i'}, - {"stripe_index", required_argument, 0, 'i'}, - {"comp-id", required_argument, 0, 'I'}, - {"component-id", required_argument, 0, 'I'}, - {"mdt", required_argument, 0, 'm'}, - {"mdt-index", required_argument, 0, 'm'}, - {"mdt_index", required_argument, 0, 'm'}, - /* --non-block is only valid in migrate mode */ - {"non-block", no_argument, 0, 'n'}, - {"ost", required_argument, 0, 'o'}, + { .val = 'i', .name = "stripe-index", .has_arg = required_argument}, + { .val = 'i', .name = "stripe_index", .has_arg = required_argument}, + { .val = 'I', .name = "comp-id", .has_arg = required_argument}, + { .val = 'I', .name = "component-id", .has_arg = required_argument}, + { .val = 'm', .name = "mdt", .has_arg = required_argument}, + { .val = 'm', .name = "mdt-index", .has_arg = required_argument}, + { .val = 'm', .name = "mdt_index", .has_arg = required_argument}, + /* --non-block is only valid in migrate mode */ + { .val = 'n', .name = "non-block", .has_arg = no_argument}, + { .val = 'o', .name = "ost", .has_arg = required_argument}, #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) - {"ost-list", required_argument, 0, 'o'}, - {"ost_list", required_argument, 0, 'o'}, + { .val = 'o', .name = "ost-list", .has_arg = required_argument }, + { .val = 'o', .name = "ost_list", .has_arg = required_argument }, #endif - {"pool", required_argument, 0, 'p'}, + { .val = 'p', .name = "pool", .has_arg = required_argument }, #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0) - /* This formerly implied "--stripe-size", but was confusing - * with "lfs find --size|-s", which means "file size", so use - * the consistent "--stripe-size|-S" for all commands. */ - {"size", required_argument, 0, 's'}, + /* This formerly implied "--stripe-size", but was confusing + * with "lfs find --size|-s", which means "file size", so use + * the consistent "--stripe-size|-S" for all commands. */ + { .val = 's', .name = "size", .has_arg = required_argument }, #endif - {"stripe-size", required_argument, 0, 'S'}, - {"stripe_size", required_argument, 0, 'S'}, - /* dirstripe {"mdt-count", required_argument, 0, 'T'}, */ - /* --verbose is only valid in migrate mode */ - {"verbose", no_argument, 0, 'v'}, - {0, 0, 0, 0} - }; + { .val = 'S', .name = "stripe-size", .has_arg = required_argument }, + { .val = 'S', .name = "stripe_size", .has_arg = required_argument }, + /* dirstripe {"mdt-count", required_argument, 0, 'T'}, */ + /* --verbose is only valid in migrate mode */ + { .val = 'v', .name = "verbose", .has_arg = no_argument }, + { .val = LFS_COMP_ADD_OPT, + .name = "component-add", + .has_arg = no_argument }, + { .val = LFS_COMP_DEL_OPT, + .name = "component-del", + .has_arg = no_argument }, + { .val = LFS_COMP_FLAGS_OPT, + .name = "component-flags", + .has_arg = required_argument }, + { .val = LFS_COMP_SET_OPT, + .name = "component-set", + .has_arg = no_argument }, + { .name = NULL } }; setstripe_args_init(&lsa); @@ -1379,7 +1445,7 @@ static int lfs_setstripe(int argc, char **argv) comp_del = 1; break; case LFS_COMP_FLAGS_OPT: - result = comp_name2flags(&lsa.lsa_comp_flags, optarg); + result = comp_str2flags(&lsa.lsa_comp_flags, optarg); if (result != 0) { fprintf(stderr, "error: %s: bad comp flags " "'%s'\n", argv[0], optarg); @@ -1423,9 +1489,7 @@ static int lfs_setstripe(int argc, char **argv) setstripe_args_init(&lsa); } - if (!strncmp(optarg, "-1", strlen("-1")) || - !strncmp(optarg, "EOF", strlen("EOF")) || - !strncmp(optarg, "eof", strlen("eof"))) { + if (arg_is_eof(optarg)) { lsa.lsa_comp_end = LUSTRE_EOF; } else { result = llapi_parse_size(optarg, @@ -1452,7 +1516,8 @@ static int lfs_setstripe(int argc, char **argv) break; case 'I': comp_id = strtoul(optarg, &end, 0); - if (*end != '\0' || comp_id == 0) { + if (*end != '\0' || comp_id == 0 || + comp_id > LCME_ID_MAX) { fprintf(stderr, "error: %s: bad comp ID " "'%s'\n", argv[0], optarg); goto error; @@ -1576,6 +1641,18 @@ static int lfs_setstripe(int argc, char **argv) goto error; } + if (comp_add || comp_del) { + struct stat st; + + result = lstat(fname, &st); + if (result == 0 && S_ISDIR(st.st_mode)) { + fprintf(stderr, "error: %s: can't use --component-add " + "or --component-del for directory.\n", + argv[0]); + goto error; + } + } + if (comp_add) { if (layout == NULL) { fprintf(stderr, "error: %s: -E option must be present" @@ -1583,7 +1660,9 @@ static int lfs_setstripe(int argc, char **argv) goto error; } result = adjust_first_extent(fname, layout); - if (result != 0) + if (result == -ENODATA) + comp_add = 0; + else if (result != 0) goto error; } @@ -1600,10 +1679,9 @@ static int lfs_setstripe(int argc, char **argv) goto error; } - /* support --component-id option for migrate later. */ - if (migrate_mode && comp_id != 0) { - fprintf(stderr, "error: %s: -I isn't supported yet.\n", - argv[0]); + if (!comp_del && !comp_set && comp_id != 0) { + fprintf(stderr, "error: %s: -I can only be used with " + "--component-del.\n", argv[0]); goto error; } @@ -1957,8 +2035,8 @@ static int lfs_find(int argc, char **argv) param.fp_exclude_comp_count = !!neg_opt; break; case LFS_COMP_FLAGS_OPT: - rc = comp_name2flags(¶m.fp_comp_flags, optarg); - if (rc) { + rc = comp_str2flags(¶m.fp_comp_flags, optarg); + if (rc || comp_flags_is_neg(param.fp_comp_flags)) { fprintf(stderr, "error: bad component flags " "'%s'\n", optarg); goto err; @@ -2016,8 +2094,15 @@ static int lfs_find(int argc, char **argv) optarg++; } - rc = llapi_parse_size(optarg, ¶m.fp_comp_end, - ¶m.fp_comp_end_units, 0); + if (arg_is_eof(optarg)) { + param.fp_comp_end = LUSTRE_EOF; + param.fp_comp_end_units = 1; + rc = 0; + } else { + rc = llapi_parse_size(optarg, + ¶m.fp_comp_end, + ¶m.fp_comp_end_units, 0); + } if (rc) { fprintf(stderr, "error: bad component end " "'%s'\n", optarg); @@ -2320,10 +2405,10 @@ static int lfs_getstripe_internal(int argc, char **argv, struct option long_opts[] = { {"comp-count", no_argument, 0, LFS_COMP_COUNT_OPT}, {"component-count", no_argument, 0, LFS_COMP_COUNT_OPT}, - {"comp-flags", required_argument, 0, LFS_COMP_FLAGS_OPT}, - {"component-flags", required_argument, 0, LFS_COMP_FLAGS_OPT}, - {"comp-start", required_argument, 0, LFS_COMP_START_OPT}, - {"component-start", required_argument, 0, LFS_COMP_START_OPT}, + {"comp-flags", optional_argument, 0, LFS_COMP_FLAGS_OPT}, + {"component-flags", optional_argument, 0, LFS_COMP_FLAGS_OPT}, + {"comp-start", optional_argument, 0, LFS_COMP_START_OPT}, + {"component-start", optional_argument, 0, LFS_COMP_START_OPT}, #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0) /* This formerly implied "stripe-count", but was explicitly * made "stripe-count" for consistency with other options, @@ -2334,8 +2419,8 @@ static int lfs_getstripe_internal(int argc, char **argv, {"stripe_count", no_argument, 0, 'c'}, {"directory", no_argument, 0, 'd'}, {"default", no_argument, 0, 'D'}, - {"comp-end", required_argument, 0, 'E'}, - {"component-end", required_argument, 0, 'E'}, + {"comp-end", optional_argument, 0, 'E'}, + {"component-end", optional_argument, 0, 'E'}, {"fid", no_argument, 0, 'F'}, {"generation", no_argument, 0, 'g'}, /* dirstripe {"mdt-hash", required_argument, 0, 'H'}, */ @@ -2347,8 +2432,8 @@ static int lfs_getstripe_internal(int argc, char **argv, #endif {"stripe-index", no_argument, 0, 'i'}, {"stripe_index", no_argument, 0, 'i'}, - {"comp-id", required_argument, 0, 'I'}, - {"component-id", required_argument, 0, 'I'}, + {"comp-id", optional_argument, 0, 'I'}, + {"component-id", optional_argument, 0, 'I'}, {"layout", no_argument, 0, 'L'}, {"mdt", no_argument, 0, 'm'}, {"mdt-index", no_argument, 0, 'm'}, @@ -2385,7 +2470,7 @@ static int lfs_getstripe_internal(int argc, char **argv, int c, rc; char *end, *tmp; - while ((c = getopt_long(argc, argv, "cdDE:FghiI:LmMoO:pqrRsSvy", + while ((c = getopt_long(argc, argv, "cdDE::FghiI::LmMoO:pqrRsSvy", long_opts, NULL)) != -1) { switch (c) { case 'c': @@ -2403,15 +2488,18 @@ static int lfs_getstripe_internal(int argc, char **argv, break; case LFS_COMP_FLAGS_OPT: if (optarg != NULL) { - rc = comp_name2flags(¶m->fp_comp_flags, - optarg); + __u32 *flags = ¶m->fp_comp_flags; + rc = comp_str2flags(flags, optarg); if (rc != 0) { - param->fp_verbose |= - VERBOSE_COMP_FLAGS; - param->fp_max_depth = 0; - optind--; + fprintf(stderr, "error: %s bad " + "component flags '%s'.\n", + argv[0], optarg); + return CMD_HELP; } else { param->fp_check_comp_flags = 1; + param->fp_exclude_comp_flags = + comp_flags_is_neg(*flags); + comp_flags_clear_neg(flags); } } else { param->fp_verbose |= VERBOSE_COMP_FLAGS; @@ -2422,19 +2510,20 @@ static int lfs_getstripe_internal(int argc, char **argv, if (optarg != NULL) { tmp = optarg; if (tmp[0] == '+') { - param->fp_comp_start_sign = 1; + param->fp_comp_start_sign = -1; tmp++; } else if (tmp[0] == '-') { - param->fp_comp_start_sign = -1; + param->fp_comp_start_sign = 1; tmp++; } rc = llapi_parse_size(tmp, ¶m->fp_comp_start, ¶m->fp_comp_start_units, 0); if (rc != 0) { - param->fp_verbose |= VERBOSE_COMP_START; - param->fp_max_depth = 0; - optind--; + fprintf(stderr, "error: %s bad " + "component start '%s'.\n", + argv[0], tmp); + return CMD_HELP; } else { param->fp_check_comp_start = 1; } @@ -2453,22 +2542,29 @@ static int lfs_getstripe_internal(int argc, char **argv, if (optarg != NULL) { tmp = optarg; if (tmp[0] == '+') { - param->fp_comp_end_sign = 1; + param->fp_comp_end_sign = -1; tmp++; } else if (tmp[0] == '-') { - param->fp_comp_end_sign = -1; + param->fp_comp_end_sign = 1; tmp++; } - rc = llapi_parse_size(tmp, + + if (arg_is_eof(tmp)) { + param->fp_comp_end = LUSTRE_EOF; + param->fp_comp_end_units = 1; + rc = 0; + } else { + rc = llapi_parse_size(tmp, ¶m->fp_comp_end, ¶m->fp_comp_end_units, 0); + } if (rc != 0) { - param->fp_verbose |= VERBOSE_COMP_END; - param->fp_max_depth = 0; - optind--; - } else { - param->fp_check_comp_end = 1; + fprintf(stderr, "error: %s bad " + "component end '%s'.\n", + argv[0], tmp); + return CMD_HELP; } + param->fp_check_comp_end = 1; } else { param->fp_verbose |= VERBOSE_COMP_END; param->fp_max_depth = 0; @@ -2505,10 +2601,12 @@ static int lfs_getstripe_internal(int argc, char **argv, case 'I': if (optarg != NULL) { param->fp_comp_id = strtoul(optarg, &end, 0); - if (*end != '\0') { - param->fp_verbose |= VERBOSE_COMP_ID; - param->fp_max_depth = 0; - optind--; + if (*end != '\0' || param->fp_comp_id == 0 || + param->fp_comp_id > LCME_ID_MAX) { + fprintf(stderr, "error: %s bad " + "component id '%s'\n", + argv[0], optarg); + return CMD_HELP; } else { param->fp_check_comp_id = 1; } @@ -4317,26 +4415,26 @@ static int lfs_changelog(int argc, char **argv) return rc; } - while ((rc = llapi_changelog_recv(changelog_priv, &rec)) == 0) { - time_t secs; - struct tm ts; + while ((rc = llapi_changelog_recv(changelog_priv, &rec)) == 0) { + time_t secs; + struct tm ts; - if (endrec && rec->cr_index > endrec) { - llapi_changelog_free(&rec); - break; - } - if (rec->cr_index < startrec) { - llapi_changelog_free(&rec); - continue; - } + if (endrec && rec->cr_index > endrec) { + llapi_changelog_free(&rec); + break; + } + if (rec->cr_index < startrec) { + llapi_changelog_free(&rec); + continue; + } secs = rec->cr_time >> 30; gmtime_r(&secs, &ts); - printf("%ju %02d%-5s %02d:%02d:%02d.%06d %04d.%02d.%02d " - "0x%x t="DFID, (uintmax_t) rec->cr_index, rec->cr_type, + printf("%ju %02d%-5s %02d:%02d:%02d.%09d %04d.%02d.%02d " + "0x%x t="DFID, (uintmax_t)rec->cr_index, rec->cr_type, changelog_type2str(rec->cr_type), ts.tm_hour, ts.tm_min, ts.tm_sec, - (int)(rec->cr_time & ((1<<30) - 1)), + (int)(rec->cr_time & ((1 << 30) - 1)), ts.tm_year + 1900, ts.tm_mon + 1, ts.tm_mday, rec->cr_flags & CLF_FLAGMASK, PFID(&rec->cr_tfid));