#include <libcfs/util/parser.h>
#include <lustre/lustreapi.h>
#include <lustre_ver.h>
-#include <lustre_param.h>
+#include <linux/lustre_param.h>
#ifndef ARRAY_SIZE
# define ARRAY_SIZE(a) ((sizeof(a)) / (sizeof((a)[0])))
" <filename>\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"
"usage: getstripe [--ost|-O <uuid>] [--quiet|-q] [--verbose|-v]\n"
" [--stripe-count|-c] [--stripe-index|-i]\n"
" [--pool|-p] [--stripe-size|-S] [--directory|-d]\n"
- " [--mdt|-m] [--recursive|-r] [--raw|-R]\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"
" <directory|filename> ..."},
{"setdirstripe", lfs_setdirstripe, 0,
"To create a striped directory on a specified MDT. This can only\n"
"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>] [--mdt-count|-c]\n"
- " [--mdt-index|-i] [--mdt-hash|-H]\n"
- " [--recursive|-r] [--default|-D] <dir> ..."},
+ " [--mdt-index|-i] [--mdt-hash|-t]\n"
+ " [--recursive|-r] [--yaml|-y]\n"
+ " [--default|-D] <dir> ..."},
{"mkdir", lfs_setdirstripe, 0,
"To create a striped directory on a specified MDT. This can only\n"
"be done on MDT0 with the right of administrator.\n"
" [[!] --mdt-count|-T [+-]<stripes>]\n"
" [[!] --mdt-hash|-H <hashtype>\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"},
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));
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 {
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",
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;
+ }
}
- return (*flags == 0) ? -EINVAL : 0;
+
+ 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 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 {
__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);
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);
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,
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;
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"
goto error;
}
result = adjust_first_extent(fname, layout);
- if (result != 0)
+ if (result == -ENODATA)
+ comp_add = 0;
+ else if (result != 0)
goto error;
}
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;
}
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;
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);
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,
{"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'}, */
#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'},
{"stripe_size", no_argument, 0, 'S'},
/* dirstripe {"mdt-count", required_argument, 0, 'T'}, */
{"verbose", no_argument, 0, 'v'},
+ {"yaml", no_argument, 0, 'y'},
{0, 0, 0, 0}
};
int c, rc;
char *end, *tmp;
- while ((c = getopt_long(argc, argv, "cdDE:FghiI:LmMoO:pqrRsSv",
+ while ((c = getopt_long(argc, argv, "cdDE::FghiI::LmMoO:pqrRsSvy",
long_opts, NULL)) != -1) {
switch (c) {
case 'c':
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;
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;
}
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;
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;
}
case 'v':
param->fp_verbose = VERBOSE_DEFAULT | VERBOSE_DETAIL;
break;
+ case 'y':
+ param->fp_yaml = 1;
+ break;
default:
return CMD_HELP;
}
{"default", no_argument, 0, 'D'},
{"obd", required_argument, 0, 'O'},
{"mdt-count", no_argument, 0, 'T'},
+ {"yaml", no_argument, 0, 'y'},
{0, 0, 0, 0}
};
int c, rc;
param.fp_get_lmv = 1;
while ((c = getopt_long(argc, argv,
- "cDHiO:rtT", long_opts, NULL)) != -1)
+ "cDHiO:rtTy", long_opts, NULL)) != -1)
{
switch (c) {
case 'O':
case 'r':
param.fp_recursive = 1;
break;
+ case 'y':
+ param.fp_yaml = 1;
+ break;
default:
return CMD_HELP;
}
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));