Whamcloud - gitweb
LU-6535 utils: fix updating index and fsname 32/14632/4
authorWang Shilong <wshilong@ddn.com>
Mon, 4 May 2015 13:07:22 +0000 (21:07 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 5 Jun 2015 01:54:33 +0000 (01:54 +0000)
We should do whether we can update index and fsname checks after
we have done all options parsing, otherwise, we failed this command:
tunefs.lustre --fsname=lustre --writeconf /dev/mgs
but succeed with following command:
tunefs.lustre --writeconf --fsname=lustre /dev/mgs

Signed-off-by: Wang Shilong <wshilong@ddn.com>
Change-Id: Iadeaad1a6245c58214330c544df245b532f42372
Reviewed-on: http://review.whamcloud.com/14632
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: James Nunez <james.a.nunez@intel.com>
Reviewed-by: Emoly Liu <emoly.liu@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/utils/mkfs_lustre.c

index 2b9e5a6..bae26df 100644 (file)
@@ -54,6 +54,7 @@
 #include <fcntl.h>
 #include <stdarg.h>
 #include <mntent.h>
+#include <stdbool.h>
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -315,6 +316,8 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop,
        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) {
@@ -399,13 +402,7 @@ 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) {
@@ -423,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);
@@ -443,6 +432,7 @@ 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': {
@@ -531,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;