Whamcloud - gitweb
LU-6210 utils: Use C99 struct initializers in lfs_hsm_state()
[fs/lustre-release.git] / lustre / utils / lfs.c
index 3eb8cec..f0e8543 100644 (file)
@@ -1171,17 +1171,11 @@ static int adjust_first_extent(char *fname, struct llapi_layout *layout)
                 * 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;
-               }
+       } 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);
@@ -1254,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)
@@ -1333,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);
 
@@ -1409,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);
@@ -1858,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;
@@ -1999,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(&param.fp_comp_flags, optarg);
+                       rc = comp_str2flags(&param.fp_comp_flags, optarg);
                        if (rc || comp_flags_is_neg(param.fp_comp_flags)) {
                                fprintf(stderr, "error: bad component flags "
                                        "'%s'\n", optarg);
@@ -2453,7 +2494,7 @@ static int lfs_getstripe_internal(int argc, char **argv,
                case LFS_COMP_FLAGS_OPT:
                        if (optarg != NULL) {
                                __u32 *flags = &param->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",
@@ -2822,26 +2863,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) {
@@ -3024,10 +3065,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) {
@@ -3218,9 +3258,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;
@@ -3334,13 +3375,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) {
@@ -3570,14 +3611,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));
@@ -4468,22 +4508,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++;
@@ -4558,10 +4597,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 = "";
@@ -4736,14 +4774,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;