X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Flfs.c;h=1c775603d6501f8a98b4b7e61d7fc0b147e3258e;hb=a67628b9e49547b75ec92fed05f770da05d14f9d;hp=7ba9003a8c17a0d38a0d30b990e9474e1adca2bf;hpb=8e02647def0d806023cb3bb4b91c5b1e38ee2872;p=fs%2Flustre-release.git diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index 7ba9003..1c77560 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -1160,21 +1160,22 @@ 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; - } - - /* 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); + } else if (errno == ENODATA) { + /* file without LOVEA, this component-add will be turned + * into a component-create. */ llapi_layout_free(head); - return rc; + return -ENODATA; + } else if (!llapi_layout_is_composite(head)) { + fprintf(stderr, "'%s' isn't a composite file.\n", + fname); + llapi_layout_free(head); + return -EINVAL; } rc = llapi_layout_comp_extent_get(head, &start, &prev_end); @@ -1247,25 +1248,37 @@ static inline void comp_flags_clear_neg(__u32 *flags) *flags &= ~LCME_FL_NEG; } -static int comp_name2flags(__u32 *flags, char *name) +static int comp_str2flags(__u32 *flags, char *string) { - char *ptr; + 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 if (strcmp(flg, "^init") == 0) - neg_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) @@ -1326,63 +1339,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); @@ -1402,7 +1439,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); @@ -1598,6 +1635,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" @@ -1605,7 +1654,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; } @@ -1837,54 +1888,65 @@ static int lfs_find(int argc, char **argv) { int c, rc; int ret = 0; - time_t t; + time_t t; struct find_param param = { .fp_max_depth = -1, .fp_quiet = 1, }; struct option long_opts[] = { - {"atime", required_argument, 0, 'A'}, - {"comp-count", required_argument, 0, LFS_COMP_COUNT_OPT}, - {"component-count", required_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}, - {"stripe-count", required_argument, 0, 'c'}, - {"stripe_count", required_argument, 0, 'c'}, - {"ctime", required_argument, 0, 'C'}, - {"maxdepth", required_argument, 0, 'D'}, - {"comp-end", required_argument, 0, 'E'}, - {"component-end", required_argument, 0, 'E'}, - {"gid", required_argument, 0, 'g'}, - {"group", required_argument, 0, 'G'}, - {"mdt-hash", required_argument, 0, 'H'}, - {"stripe-index", required_argument, 0, 'i'}, - {"stripe_index", required_argument, 0, 'i'}, - /*{"component-id", required_argument, 0, 'I'},*/ - {"layout", required_argument, 0, 'L'}, - {"mdt", required_argument, 0, 'm'}, - {"mdt-index", required_argument, 0, 'm'}, - {"mdt_index", required_argument, 0, 'm'}, - {"mtime", required_argument, 0, 'M'}, - {"name", required_argument, 0, 'n'}, + { .val = 'A', .name = "atime", .has_arg = required_argument }, + { .val = LFS_COMP_COUNT_OPT, + .name = "comp-count", .has_arg = required_argument }, + { .val = LFS_COMP_COUNT_OPT, + .name = "component-count", + .has_arg = required_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_START_OPT, + .name = "comp-start", .has_arg = required_argument }, + { .val = LFS_COMP_START_OPT, + .name = "component-start", + .has_arg = required_argument }, + { .val = 'c', .name = "stripe-count", .has_arg = required_argument }, + { .val = 'c', .name = "stripe_count", .has_arg = required_argument }, + { .val = 'C', .name = "ctime", .has_arg = required_argument }, + { .val = 'D', .name = "maxdepth", .has_arg = required_argument }, + { .val = 'E', .name = "comp-end", .has_arg = required_argument }, + { .val = 'E', .name = "component-end", + .has_arg = required_argument }, + { .val = 'g', .name = "gid", .has_arg = required_argument }, + { .val = 'G', .name = "group", .has_arg = required_argument }, + { .val = 'H', .name = "mdt-hash", .has_arg = required_argument }, + { .val = 'i', .name = "stripe-index", .has_arg = required_argument }, + { .val = 'i', .name = "stripe_index", .has_arg = required_argument }, + /*{"component-id", required_argument, 0, 'I'},*/ + { .val = 'L', .name = "layout", .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 }, + { .val = 'M', .name = "mtime", .has_arg = required_argument }, + { .val = 'n', .name = "name", .has_arg = required_argument }, /* reserve {"or", no_argument, , 0, 'o'}, to match find(1) */ - {"obd", required_argument, 0, 'O'}, - {"ost", required_argument, 0, 'O'}, - /* no short option for pool, p/P already used */ - {"pool", required_argument, 0, LFS_POOL_OPT}, - {"print0", no_argument, 0, 'p'}, - {"print", no_argument, 0, 'P'}, - {"projid", required_argument, 0, LFS_PROJID_OPT}, - {"size", required_argument, 0, 's'}, - {"stripe-size", required_argument, 0, 'S'}, - {"stripe_size", required_argument, 0, 'S'}, - {"type", required_argument, 0, 't'}, - {"mdt-count", required_argument, 0, 'T'}, - {"uid", required_argument, 0, 'u'}, - {"user", required_argument, 0, 'U'}, - {0, 0, 0, 0} - }; + { .val = 'O', .name = "obd", .has_arg = required_argument }, + { .val = 'O', .name = "ost", .has_arg = required_argument }, + /* no short option for pool, p/P already used */ + { .val = LFS_POOL_OPT, + .name = "pool", .has_arg = required_argument }, + { .val = 'p', .name = "print0", .has_arg = no_argument }, + { .val = 'P', .name = "print", .has_arg = no_argument }, + { .val = LFS_PROJID_OPT, + .name = "projid", .has_arg = required_argument }, + { .val = 's', .name = "size", .has_arg = required_argument }, + { .val = 'S', .name = "stripe-size", .has_arg = required_argument }, + { .val = 'S', .name = "stripe_size", .has_arg = required_argument }, + { .val = 't', .name = "type", .has_arg = required_argument }, + { .val = 'T', .name = "mdt-count", .has_arg = required_argument }, + { .val = 'u', .name = "uid", .has_arg = required_argument }, + { .val = 'U', .name = "user", .has_arg = required_argument }, + { .name = NULL } }; int pathstart = -1; int pathend = -1; int neg_opt = 0; @@ -1978,7 +2040,7 @@ 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); + 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); @@ -2346,70 +2408,78 @@ static int lfs_getstripe_internal(int argc, char **argv, struct find_param *param) { struct option long_opts[] = { - {"comp-count", no_argument, 0, LFS_COMP_COUNT_OPT}, - {"component-count", no_argument, 0, LFS_COMP_COUNT_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}, + { .val = LFS_COMP_COUNT_OPT, + .name = "comp-count", .has_arg = no_argument }, + { .val = LFS_COMP_COUNT_OPT, + .name = "component-count", .has_arg = no_argument }, + { .val = LFS_COMP_FLAGS_OPT, + .name = "comp-flags", .has_arg = optional_argument }, + { .val = LFS_COMP_FLAGS_OPT, + .name = "component-flags", .has_arg = optional_argument }, + { .val = LFS_COMP_START_OPT, + .name = "comp-start", .has_arg = optional_argument }, + { .val = LFS_COMP_START_OPT, + .name = "component-start", .has_arg = optional_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", no_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 = no_argument }, #endif - {"stripe-count", no_argument, 0, 'c'}, - {"stripe_count", no_argument, 0, 'c'}, - {"directory", no_argument, 0, 'd'}, - {"default", no_argument, 0, 'D'}, - {"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'}, */ + { .val = 'c', .name = "stripe-count", .has_arg = no_argument }, + { .val = 'c', .name = "stripe_count", .has_arg = no_argument }, + { .val = 'd', .name = "directory", .has_arg = no_argument }, + { .val = 'D', .name = "default", .has_arg = no_argument }, + { .val = 'E', .name = "comp-end", .has_arg = optional_argument }, + { .val = 'E', .name = "component-end", + .has_arg = optional_argument }, + { .val = 'F', .name = "fid", .has_arg = no_argument }, + { .val = 'g', .name = "generation", .has_arg = no_argument }, + /* dirstripe { .val = 'H', .name = "mdt-hash", + * .has_arg = required_argument }, */ #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", no_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 = no_argument }, #endif - {"stripe-index", no_argument, 0, 'i'}, - {"stripe_index", no_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'}, - {"mdt_index", no_argument, 0, 'm'}, + { .val = 'i', .name = "stripe-index", .has_arg = no_argument }, + { .val = 'i', .name = "stripe_index", .has_arg = no_argument }, + { .val = 'I', .name = "comp-id", .has_arg = optional_argument }, + { .val = 'I', .name = "component-id", .has_arg = optional_argument }, + { .val = 'L', .name = "layout", .has_arg = no_argument }, + { .val = 'm', .name = "mdt", .has_arg = no_argument }, + { .val = 'm', .name = "mdt-index", .has_arg = no_argument }, + { .val = 'm', .name = "mdt_index", .has_arg = no_argument }, #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) - {"mdt-index", no_argument, 0, 'M'}, - {"mdt_index", no_argument, 0, 'M'}, + { .val = 'M', .name = "mdt-index", .has_arg = no_argument }, + { .val = 'M', .name = "mdt_index", .has_arg = no_argument }, #endif #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 59, 0) - /* This formerly implied "stripe-index", but was confusing - * with "file offset" (which will eventually be needed for - * with different layouts by offset), so deprecate it. */ - {"offset", no_argument, 0, 'o'}, + /* This formerly implied "stripe-index", but was confusing + * with "file offset" (which will eventually be needed for + * with different layouts by offset), so deprecate it. */ + { .val = 'o', .name = "offset", .has_arg = no_argument }, #endif - {"obd", required_argument, 0, 'O'}, - {"ost", required_argument, 0, 'O'}, - {"pool", no_argument, 0, 'p'}, - {"quiet", no_argument, 0, 'q'}, - {"recursive", no_argument, 0, 'r'}, - {"raw", no_argument, 0, 'R'}, + { .val = 'O', .name = "obd", .has_arg = required_argument }, + { .val = 'O', .name = "ost", .has_arg = required_argument }, + { .val = 'p', .name = "pool", .has_arg = no_argument }, + { .val = 'q', .name = "quiet", .has_arg = no_argument }, + { .val = 'r', .name = "recursive", .has_arg = no_argument }, + { .val = 'R', .name = "raw", .has_arg = no_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", no_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 = no_argument }, #endif - {"stripe-size", no_argument, 0, 'S'}, - {"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} - }; + { .val = 'S', .name = "stripe-size", .has_arg = no_argument }, + { .val = 'S', .name = "stripe_size", .has_arg = no_argument }, + /* dirstripe { .val = 'T', .name = "mdt-count", + * .has_arg = required_argument }, */ + { .val = 'v', .name = "verbose", .has_arg = no_argument }, + { .val = 'y', .name = "yaml", .has_arg = no_argument }, + { .name = NULL } }; int c, rc; char *end, *tmp; @@ -2432,7 +2502,7 @@ static int lfs_getstripe_internal(int argc, char **argv, case LFS_COMP_FLAGS_OPT: if (optarg != NULL) { __u32 *flags = ¶m->fp_comp_flags; - rc = comp_name2flags(flags, optarg); + rc = comp_str2flags(flags, optarg); if (rc != 0) { fprintf(stderr, "error: %s bad " "component flags '%s'.\n", @@ -2801,26 +2871,26 @@ static int lfs_setdirstripe(int argc, char **argv) struct option long_opts[] = { #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) - {"count", required_argument, 0, 'c'}, + { .val = 'c', .name = "count", .has_arg = required_argument }, #endif - {"mdt-count", required_argument, 0, 'c'}, - {"delete", no_argument, 0, 'd'}, + { .val = 'c', .name = "mdt-count", .has_arg = required_argument }, + { .val = 'd', .name = "delete", .has_arg = no_argument }, #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) - {"index", required_argument, 0, 'i'}, + { .val = 'i', .name = "index", .has_arg = required_argument }, #endif - {"mdt-index", required_argument, 0, 'i'}, - {"mode", required_argument, 0, 'm'}, + { .val = 'i', .name = "mdt-index", .has_arg = required_argument }, + { .val = 'm', .name = "mode", .has_arg = required_argument }, #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) - {"hash-type", required_argument, 0, 't'}, - {"mdt-hash", required_argument, 0, 't'}, + { .val = 't', .name = "hash-type", .has_arg = required_argument }, + { .val = 't', .name = "mdt-hash", .has_arg = required_argument }, #endif {"mdt-hash", required_argument, 0, 'H'}, #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) - {"default_stripe", no_argument, 0, 'D'}, + { .val = 'D', .name = "default_stripe", + .has_arg = no_argument }, #endif - {"default", no_argument, 0, 'D'}, - {0, 0, 0, 0} - }; + { .val = 'D', .name = "default", .has_arg = no_argument }, + { .name = NULL } }; while ((c = getopt_long(argc, argv, "c:dDi:H:m:t:", long_opts, NULL)) >= 0) { @@ -3003,10 +3073,9 @@ static int lfs_mv(int argc, char **argv) int c; int rc = 0; struct option long_opts[] = { - {"mdt-index", required_argument, 0, 'M'}, - {"verbose", no_argument, 0, 'v'}, - {0, 0, 0, 0} - }; + { .val = 'M', .name = "mdt-index", .has_arg = required_argument }, + { .val = 'v', .name = "verbose", .has_arg = no_argument }, + { .name = NULL } }; while ((c = getopt_long(argc, argv, "M:v", long_opts, NULL)) != -1) { switch (c) { @@ -3197,9 +3266,10 @@ static int mntdf(char *mntdir, char *fsname, char *pool, enum mntdf_flags flags) 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 types[] = { + { .st_op = LL_STATFS_LMV, .st_name = "MDT" }, + { .st_op = LL_STATFS_LOV, .st_name = "OST" }, + { .st_name = NULL } }; struct ll_stat_type *tp; __u64 ost_ffree = 0; __u32 index; @@ -3313,13 +3383,13 @@ static int lfs_df(int argc, char **argv) int c, rc = 0, index = 0; char fsname[PATH_MAX] = "", *pool_name = NULL; struct option long_opts[] = { - {"human-readable", 0, 0, 'h'}, - {"inodes", 0, 0, 'i'}, - {"lazy", 0, 0, 'l'}, - {"pool", required_argument, 0, 'p'}, - {"verbose", 0, 0, 'v'}, - {0, 0, 0, 0} - }; + { .val = 'h', .name = "human-readable", + .has_arg = no_argument }, + { .val = 'i', .name = "inodes", .has_arg = no_argument }, + { .val = 'l', .name = "lazy", .has_arg = no_argument }, + { .val = 'p', .name = "pool", .has_arg = required_argument }, + { .val = 'v', .name = "verbose", .has_arg = no_argument }, + { .name = NULL} }; while ((c = getopt_long(argc, argv, "hilp:v", long_opts, NULL)) != -1) { switch (c) { @@ -3549,14 +3619,13 @@ int lfs_setquota_times(int argc, char **argv) struct obd_dqblk *dqb = &qctl.qc_dqblk; struct obd_dqinfo *dqi = &qctl.qc_dqinfo; struct option long_opts[] = { - {"block-grace", required_argument, 0, 'b'}, - {"group", no_argument, 0, 'g'}, - {"inode-grace", required_argument, 0, 'i'}, - {"projid", no_argument, 0, 'p'}, - {"times", no_argument, 0, 't'}, - {"user", no_argument, 0, 'u'}, - {0, 0, 0, 0} - }; + { .val = 'b', .name = "block-grace", .has_arg = required_argument }, + { .val = 'g', .name = "group", .has_arg = no_argument }, + { .val = 'i', .name = "inode-grace", .has_arg = required_argument }, + { .val = 'p', .name = "projid", .has_arg = no_argument }, + { .val = 't', .name = "times", .has_arg = no_argument }, + { .val = 'u', .name = "user", .has_arg = no_argument }, + { .name = NULL } }; int qtype; memset(&qctl, 0, sizeof(qctl)); @@ -4447,22 +4516,21 @@ static int lfs_changelog_clear(int argc, char **argv) static int lfs_fid2path(int argc, char **argv) { - struct option long_opts[] = { - {"cur", no_argument, 0, 'c'}, - {"link", required_argument, 0, 'l'}, - {"rec", required_argument, 0, 'r'}, - {0, 0, 0, 0} - }; - char short_opts[] = "cl:r:"; - char *device, *fid, *path; - long long recno = -1; - int linkno = -1; - int lnktmp; - int printcur = 0; + struct option long_opts[] = { + { .val = 'c', .name = "cur", .has_arg = no_argument }, + { .val = 'l', .name = "link", .has_arg = required_argument }, + { .val = 'r', .name = "rec", .has_arg = required_argument }, + { .name = NULL } }; + char short_opts[] = "cl:r:"; + char *device, *fid, *path; + long long recno = -1; + int linkno = -1; + int lnktmp; + int printcur = 0; int rc = 0; - while ((rc = getopt_long(argc, argv, short_opts, - long_opts, NULL)) != -1) { + while ((rc = getopt_long(argc, argv, short_opts, + long_opts, NULL)) != -1) { switch (rc) { case 'c': printcur++; @@ -4537,10 +4605,9 @@ static int lfs_fid2path(int argc, char **argv) static int lfs_path2fid(int argc, char **argv) { - struct option long_opts[] = { - {"parents", no_argument, 0, 'p'}, - {0, 0, 0, 0} - }; + struct option long_opts[] = { + { .val = 'p', .name = "parents", .has_arg = no_argument }, + { .name = NULL } }; char **path; const char short_opts[] = "p"; const char *sep = ""; @@ -4715,14 +4782,13 @@ static int lfs_hsm_state(int argc, char **argv) static int lfs_hsm_change_flags(int argc, char **argv, int mode) { struct option long_opts[] = { - {"lost", 0, 0, 'l'}, - {"norelease", 0, 0, 'r'}, - {"noarchive", 0, 0, 'a'}, - {"archived", 0, 0, 'A'}, - {"dirty", 0, 0, 'd'}, - {"exists", 0, 0, 'e'}, - {0, 0, 0, 0} - }; + { .val = 'A', .name = "archived", .has_arg = no_argument }, + { .val = 'a', .name = "noarchive", .has_arg = no_argument }, + { .val = 'd', .name = "dirty", .has_arg = no_argument }, + { .val = 'e', .name = "exists", .has_arg = no_argument }, + { .val = 'l', .name = "lost", .has_arg = no_argument }, + { .val = 'r', .name = "norelease", .has_arg = no_argument }, + { .name = NULL } }; char short_opts[] = "lraAde"; __u64 mask = 0; int c, rc; @@ -5181,14 +5247,13 @@ static enum lu_ladvise_type lfs_get_ladvice(const char *string) static int lfs_ladvise(int argc, char **argv) { - struct option long_opts[] = { - {"advice", required_argument, 0, 'a'}, - {"background", no_argument, 0, 'b'}, - {"end", required_argument, 0, 'e'}, - {"start", required_argument, 0, 's'}, - {"length", required_argument, 0, 'l'}, - {0, 0, 0, 0} - }; + struct option long_opts[] = { + { .val = 'a', .name = "advice", .has_arg = required_argument }, + { .val = 'b', .name = "background", .has_arg = no_argument }, + { .val = 'e', .name = "end", .has_arg = required_argument }, + { .val = 'l', .name = "length", .has_arg = required_argument }, + { .val = 's', .name = "start", .has_arg = required_argument }, + { .name = NULL } }; char short_opts[] = "a:be:l:s:"; int c; int rc = 0;