+#ifdef TUNEFS
+ /*
+ * For the right semantics, if '-e'/'--erase-params' is specified,
+ * it must be picked out and all old parameters should be erased
+ * before any other changes are done.
+ */
+ while ((opt = getopt_long(argc, argv, short_opts, long_opts,
+ &longidx)) != EOF) {
+ switch (opt) {
+ case 'e':
+ ldd->ldd_params[0] = '\0';
+ mop->mo_flags |= MO_ERASE_ALL;
+ ldd->ldd_flags |= LDD_F_UPDATE;
+ break;
+ default:
+ break;
+ }
+ if (mop->mo_flags & MO_ERASE_ALL)
+ break;
+ }
+ optind = 0;
+#endif
+ while ((opt = getopt_long(argc, argv, short_opts, long_opts,
+ &longidx)) != EOF) {
+ switch (opt) {
+ case 'B':
+ mop->mo_mountopts = optarg;
+ break;
+ case 'f':
+ case 's': {
+ char *nids;
+
+ if ((opt == 'f' && servicenode_set) ||
+ (opt == 's' && failnode_set)) {
+ fprintf(stderr, "%s: %s cannot use with --%s\n",
+ progname, long_opts[longidx].name,
+ opt == 'f' ? "servicenode" :
+ "failnode");
+ return 1;
+ }
+
+ nids = convert_hostnames(optarg);
+ if (!nids)
+ return 1;
+
+ rc = append_param(ldd->ldd_params, PARAM_FAILNODE,
+ nids, ':');
+ free(nids);
+ if (rc != 0)
+ return rc;
+
+ /* Must update the mgs logs */
+ ldd->ldd_flags |= LDD_F_UPDATE;
+ if (opt == 'f') {
+ ldd->ldd_flags &= ~LDD_F_NO_PRIMNODE;
+ failnode_set = 1;
+ } else {
+ ldd->ldd_flags |= LDD_F_NO_PRIMNODE;
+ servicenode_set = 1;
+ }
+ mop->mo_flags |= MO_FAILOVER;
+ break;
+ }
+ case 'G':
+ ldd->ldd_flags |= LDD_F_SV_TYPE_MGS;
+ break;
+ case 'h':
+ usage(stdout);
+ return 1;
+ case 'i': {
+ char *endptr = NULL;
+ int base;
+
+ index_option = true;
+ /* LU-2374: check whether it is OST/MDT later */
+ base = (strlen(optarg) > 1 &&
+ !strncmp(optarg, "0x", 2)) ? 16 : 10;
+ /* Allowed input are base 16 and base 10 numbers only */
+ mop->mo_ldd.ldd_svindex = strtoul(optarg,
+ &endptr, base);
+ if (*endptr != '\0') {
+ fprintf(stderr,
+ "%s: wrong index %s. Target index must be decimal or hexadecimal.\n",
+ progname, optarg);
+ return 1;
+ }
+ if (ldd->ldd_svindex >= INDEX_UNASSIGNED) {
+ fprintf(stderr,
+ "%s: wrong index %u. Target index must be less than %u.\n",
+ progname, ldd->ldd_svindex,
+ INDEX_UNASSIGNED);
+ return 1;
+ }
+
+ ldd->ldd_flags &= ~LDD_F_NEED_INDEX;
+ break;
+ }
+ case 'L': {
+ const char *tmp;
+ size_t len;
+
+ len = strlen(optarg);
+ if (len < 1 || len > LUSTRE_MAXFSNAME) {
+ fprintf(stderr,
+ "%s: filesystem name must be 1-%d chars\n",
+ progname, LUSTRE_MAXFSNAME);
+ return 1;
+ }
+
+ for (tmp = optarg; *tmp != '\0'; ++tmp) {
+ if (isalnum(*tmp) || *tmp == '_' || *tmp == '-')
+ continue;
+ else
+ break;
+ }
+ if (*tmp != '\0') {
+ fprintf(stderr,
+ "%s: char '%c' not allowed in filesystem name\n",
+ progname, *tmp);
+ return 1;
+ }
+ strscpy(new_fsname, optarg, sizeof(new_fsname));
+ break;
+ }
+ case 'm': {
+ char *nids = convert_hostnames(optarg);
+
+ if (!nids)
+ return 1;
+
+ rc = append_param(ldd->ldd_params, PARAM_MGSNODE,
+ nids, ':');
+ free(nids);
+ if (rc != 0)
+ return rc;
+
+ mop->mo_mgs_failnodes++;
+ break;
+ }
+ case 'n':
+ print_only++;
+ break;
+ case 'N':
+ ldd->ldd_flags &= ~LDD_F_SV_TYPE_MGS;
+ break;
+ case 'o':
+ *mountopts = optarg;
+ break;
+ case 'p':
+#ifdef TUNEFS
+ /*
+ * Removes all existing instances of the parameter
+ * before adding new values.
+ */
+ rc = erase_param(ldd->ldd_params, optarg, true);
+ if (rc > 1)
+ return rc;
+#endif
+ rc = add_param(ldd->ldd_params, NULL, optarg);
+ if (rc != 0)
+ return rc;
+ /* Must update the mgs logs */
+ ldd->ldd_flags |= LDD_F_UPDATE;
+ break;
+ case 'q':
+ verbose--;
+ break;
+ case 't':
+ if (!IS_MDT(ldd) && !IS_OST(ldd)) {
+ badopt(long_opts[longidx].name, "MDT,OST");
+ return 1;
+ }
+
+ if (!optarg)
+ return 1;
+
+ rc = add_param(ldd->ldd_params, PARAM_NETWORK, optarg);
+ if (rc != 0)
+ return rc;
+
+ /* Must update the mgs logs */
+ ldd->ldd_flags |= LDD_F_UPDATE;
+ break;
+ case 'u':
+ strscpy(ldd->ldd_userdata, optarg,
+ sizeof(ldd->ldd_userdata));
+ break;
+ case 'U':
+ mop->mo_flags |= MO_NOHOSTID_CHECK;
+ break;
+ case 'v':
+ verbose++;
+ break;
+ case 'V':
+ ++version;
+ fprintf(stdout, "%s %s\n", progname,
+ LUSTRE_VERSION_STRING);
+ return 0;
+#ifndef TUNEFS
+ case 'b': {
+ int i = 0;
+
+ do {
+ if (strcmp(optarg, mt_str(i)) == 0) {
+ ldd->ldd_mount_type = i;
+ break;
+ }
+ } while (++i < LDD_MT_LAST);
+
+ if (i == LDD_MT_LAST) {
+ fprintf(stderr,
+ "%s: invalid backend filesystem type %s\n",
+ progname, optarg);
+ return 1;
+ }
+ break;
+ }
+ case 'c':
+ if (IS_MDT(ldd)) {
+ int stripe_count = atol(optarg);
+
+ if (stripe_count <= 0) {
+ fprintf(stderr,
+ "%s: bad stripe count %s\n",
+ progname, optarg);
+ return 1;
+ }
+ mop->mo_stripe_count = stripe_count;
+ } else {
+ badopt(long_opts[longidx].name, "MDT");
+ return 1;
+ }
+ break;
+ case 'd':
+ mop->mo_device_kb = atol(optarg);
+ break;
+ case 'k':
+ strscpy(mop->mo_mkfsopts, optarg,
+ sizeof(mop->mo_mkfsopts));
+ break;
+ case 'M':
+ ldd->ldd_flags |= LDD_F_SV_TYPE_MDT;
+ break;
+ case 'O':
+ ldd->ldd_flags |= LDD_F_SV_TYPE_OST;
+ break;
+ case 'r':
+ mop->mo_flags |= MO_FORCEFORMAT;
+ break;
+ case 'R':
+ replace = 1;
+ break;
+#else /* TUNEFS */
+ case 'E':
+ rc = erase_param(ldd->ldd_params, optarg, false);
+ /*
+ * (rc == 1) means not found, so don't need to
+ * call osd_erase_ldd().
+ */
+ if (rc > 1)
+ return rc;
+ if (!rc) {
+ rc = osd_erase_ldd(mop, optarg);
+ if (rc)
+ return rc;
+ }
+ /* Must update the mgs logs */
+ ldd->ldd_flags |= LDD_F_UPDATE;
+ break;
+ case 'e':
+ /* Already done in the beginning */
+ break;
+ case 'Q':
+ mop->mo_flags |= MO_QUOTA;
+ break;
+ case 'R': {
+ char *tmp;
+
+ mop->mo_flags |= MO_RENAME;
+ if (!optarg) {
+ if (IS_SEPARATED_MGS(ldd)) {
+ fprintf(stderr,
+ "%s: must specify the old fsname to be renamed for separated MGS\n",
+ progname);
+ return 1;
+ }
+ break;
+ }
+
+ if ((strlen(optarg) < 1) || (strlen(optarg) > 8)) {
+ fprintf(stderr,
+ "%s: filesystem name must be 1-8 chars\n",
+ progname);
+ return 1;
+ }
+
+ tmp = strpbrk(optarg, "/:");
+ if (tmp) {
+ fprintf(stderr,
+ "%s: char '%c' not allowed in filesystem name\n",
+ progname, *tmp);
+ return 1;
+ }
+
+ if (IS_SEPARATED_MGS(ldd)) {
+ strscpy(old_fsname, optarg,
+ sizeof(ldd->ldd_fsname));
+ } else if (strlen(old_fsname) != strlen(optarg) ||
+ strcmp(old_fsname, optarg) != 0) {
+ fprintf(stderr,
+ "%s: the given fsname '%s' to be renamed does not exist\n",
+ progname, optarg);
+ return 1;
+ }
+ break;
+ }
+ case 'w':
+ ldd->ldd_flags |= LDD_F_WRITECONF;
+ break;
+#endif /* !TUNEFS */
+ default:
+ if (opt != '?') {
+ fatal();
+ fprintf(stderr, "Unknown option '%c'\n", opt);
+ }
+ return EINVAL;
+ }
+ }
+
+ if (strlen(new_fsname) > 0) {
+ if (!(mop->mo_flags & (MO_FORCEFORMAT | MO_RENAME)) &&
+ (!(ldd->ldd_flags & (LDD_F_VIRGIN | LDD_F_WRITECONF)))) {
+ fprintf(stderr,
+ "%s: cannot change the name of a registered target\n",
+ progname);
+ return 1;
+ }
+
+ strscpy(ldd->ldd_fsname, new_fsname, sizeof(ldd->ldd_fsname));
+ }
+
+ if (index_option && !(mop->mo_ldd.ldd_flags &
+ (LDD_F_VIRGIN | LDD_F_WRITECONF))) {
+ fprintf(stderr,
+ "%s: cannot change the index of a registered target\n",
+ progname);
+ return 1;
+ }