Whamcloud - gitweb
LU-6535 utils: fix updating index and fsname
[fs/lustre-release.git] / lustre / utils / mkfs_lustre.c
index ceed41d..bae26df 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2012, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -54,6 +54,7 @@
 #include <fcntl.h>
 #include <stdarg.h>
 #include <mntent.h>
+#include <stdbool.h>
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -64,7 +65,7 @@
 #include <getopt.h>
 #include <limits.h>
 #include <ctype.h>
-
+#include <lnet/nidstr.h>
 #include <lustre_disk.h>
 #include <lustre_param.h>
 #include <lnet/lnetctl.h>
@@ -76,6 +77,7 @@
 
 char *progname;
 int verbose = 1;
+int version;
 static int print_only = 0;
 
 #ifdef HAVE_LDISKFS_OSD
@@ -103,7 +105,6 @@ static int print_only = 0;
 
 void usage(FILE *out)
 {
-       fprintf(out, "%s v"LUSTRE_VERSION_STRING"\n", progname);
        fprintf(out, "usage: %s <target type> [--backfstype="FSLIST"] "
                "--fsname=<filesystem name>\n"
                "\t--index=<target index> [options] <device>\n", progname);
@@ -162,6 +163,8 @@ void usage(FILE *out)
                "\t\t--comment=<user comment>: arbitrary string (%d bytes)\n"
                "\t\t--dryrun: report what we would do; don't write to disk\n"
                "\t\t--verbose: e.g. show mkfs progress\n"
+               "\t\t-V|--version: output build version of the utility and\n"
+               "\t\t\texit\n"
                "\t\t--quiet\n",
                (int)sizeof(((struct lustre_disk_data *)0)->ldd_userdata));
        return;
@@ -304,14 +307,17 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop,
                { "servicenode",        required_argument,      NULL, 's' },
                { "network",            required_argument,      NULL, 't' },
                { "verbose",            no_argument,            NULL, 'v' },
+               { "version",            no_argument,            NULL, 'V' },
                { "writeconf",          no_argument,            NULL, 'w' },
                { 0,                    0,                      NULL,  0  }
        };
-       char *optstring = "b:c:C:d:ef:Ghi:k:L:m:MnNo:Op:PqrRs:t:Uu:vw";
+       char *optstring = "b:c:C:d:ef:Ghi:k:L:m:MnNo:Op:PqrRs:t:Uu:vVw";
        int opt;
        int rc, longidx;
        int failnode_set = 0, servicenode_set = 0;
        int replace = 0;
+       bool index_option = false;
+       bool fsname_option = false;
 
         while ((opt = getopt_long(argc, argv, optstring, long_opt, &longidx)) !=
                EOF) {
@@ -373,8 +379,8 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop,
                         nids = convert_hostnames(optarg);
                         if (!nids)
                                 return 1;
-                        rc = add_param(mop->mo_ldd.ldd_params, PARAM_FAILNODE,
-                                       nids);
+                       rc = append_param(mop->mo_ldd.ldd_params,
+                                         PARAM_FAILNODE, nids, ':');
                         free(nids);
                         if (rc)
                                 return rc;
@@ -396,15 +402,16 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop,
                         usage(stdout);
                         return 1;
                 case 'i':
-                        if (!(mop->mo_ldd.ldd_flags &
-                              (LDD_F_UPGRADE14 | LDD_F_VIRGIN |
-                               LDD_F_WRITECONF))) {
-                                fprintf(stderr, "%s: cannot change the index of"
-                                        " a registered target\n", progname);
-                                return 1;
-                        }
+                       index_option = true;
                        /* LU-2374: check whether it is OST/MDT later */
                        mop->mo_ldd.ldd_svindex = atol(optarg);
+                       if (mop->mo_ldd.ldd_svindex >= INDEX_UNASSIGNED) {
+                               fprintf(stderr, "%s: wrong index %u. "
+                                       "Target index must be less than %u.\n",
+                                       progname, mop->mo_ldd.ldd_svindex,
+                                       INDEX_UNASSIGNED);
+                               return 1;
+                       }
                        mop->mo_ldd.ldd_flags &= ~LDD_F_NEED_INDEX;
                         break;
                 case 'k':
@@ -413,14 +420,6 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop,
                         break;
                 case 'L': {
                         char *tmp;
-                        if (!(mop->mo_flags & MO_FORCEFORMAT) &&
-                            (!(mop->mo_ldd.ldd_flags &
-                               (LDD_F_UPGRADE14 | LDD_F_VIRGIN |
-                                LDD_F_WRITECONF)))) {
-                                fprintf(stderr, "%s: cannot change the name of"
-                                        " a registered target\n", progname);
-                                return 1;
-                        }
                         if ((strlen(optarg) < 1) || (strlen(optarg) > 8)) {
                                 fprintf(stderr, "%s: filesystem name must be "
                                         "1-8 chars\n", progname);
@@ -433,14 +432,15 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop,
                         }
                         strscpy(mop->mo_ldd.ldd_fsname, optarg,
                                 sizeof(mop->mo_ldd.ldd_fsname));
+                       fsname_option = true;
                         break;
                 }
                 case 'm': {
                         char *nids = convert_hostnames(optarg);
                         if (!nids)
                                 return 1;
-                        rc = add_param(mop->mo_ldd.ldd_params, PARAM_MGSNODE,
-                                       nids);
+                       rc = append_param(mop->mo_ldd.ldd_params,
+                                         PARAM_MGSNODE, nids, ':');
                         free(nids);
                         if (rc)
                                 return rc;
@@ -498,12 +498,17 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop,
                         strscpy(mop->mo_ldd.ldd_userdata, optarg,
                                 sizeof(mop->mo_ldd.ldd_userdata));
                         break;
-                case 'v':
-                        verbose++;
-                        break;
-                case 'w':
-                        mop->mo_ldd.ldd_flags |= LDD_F_WRITECONF;
-                        break;
+               case 'v':
+                       verbose++;
+                       break;
+               case 'V':
+                       ++version;
+                       fprintf(stdout, "%s %s\n", progname,
+                               LUSTRE_VERSION_STRING);
+                       return 0;
+               case 'w':
+                       mop->mo_ldd.ldd_flags |= LDD_F_WRITECONF;
+                       break;
                case 'Q':
                        mop->mo_flags |= MO_QUOTA;
                        break;
@@ -516,6 +521,23 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop,
                 }
         }//while
 
+       if (fsname_option &&
+           !(mop->mo_flags & MO_FORCEFORMAT) &&
+           (!(mop->mo_ldd.ldd_flags &
+              (LDD_F_UPGRADE14 | LDD_F_VIRGIN |
+               LDD_F_WRITECONF)))) {
+               fprintf(stderr, "%s: cannot change the name of"
+                       " a registered target\n", progname);
+               return 1;
+       }
+       if (index_option && !(mop->mo_ldd.ldd_flags &
+             (LDD_F_UPGRADE14 | LDD_F_VIRGIN |
+              LDD_F_WRITECONF))) {
+               fprintf(stderr, "%s: cannot change the index of"
+                       " a registered target\n", progname);
+               return 1;
+       }
+
        /* Need to clear this flag after parsing 'L' and 'i' options. */
        if (replace)
                mop->mo_ldd.ldd_flags &= ~LDD_F_VIRGIN;
@@ -603,16 +625,16 @@ int main(int argc, char *const argv[])
                mop.mo_ldd.ldd_flags |= LDD_F_WRITECONF;
        }
 
-        if (strstr(mop.mo_ldd.ldd_params, PARAM_MGSNODE))
-            mop.mo_mgs_failnodes++;
+       if (strstr(mop.mo_ldd.ldd_params, PARAM_MGSNODE))
+               mop.mo_mgs_failnodes++;
 
-        if (verbose > 0)
-                print_ldd("Read previous values", &(mop.mo_ldd));
+       if (verbose > 0)
+               print_ldd("Read previous values", &(mop.mo_ldd));
 #endif
 
-        ret = parse_opts(argc, argv, &mop, &mountopts);
-        if (ret)
-                goto out;
+       ret = parse_opts(argc, argv, &mop, &mountopts);
+       if (ret || version)
+               goto out;
 
         ldd = &mop.mo_ldd;
 
@@ -630,7 +652,7 @@ int main(int argc, char *const argv[])
                 goto out;
         }
 
-       /* Stand alone MGS doesn't need a index */
+       /* Stand alone MGS doesn't need an index */
        if (!IS_MDT(ldd) && IS_MGS(ldd)) {
 #ifndef TUNEFS /* mkfs.lustre */
                /* But if --index was specified flag an error */