X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Fmkfs_lustre.c;h=bae26df476f0ea3e041cd250b438b012604af8f0;hp=e3cfa813cbec1c44816fa5e781f66430d7ae1e6a;hb=c735a3ef9780fe846292b1f4a11d4cc47d90d5e7;hpb=14842473f5970eaf86e950739d943ebee266cf30 diff --git a/lustre/utils/mkfs_lustre.c b/lustre/utils/mkfs_lustre.c index e3cfa81..bae26df 100644 --- a/lustre/utils/mkfs_lustre.c +++ b/lustre/utils/mkfs_lustre.c @@ -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, Whamcloud, Inc. + * Copyright (c) 2011, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -54,6 +54,7 @@ #include #include #include +#include #include #include @@ -64,16 +65,7 @@ #include #include #include - -#ifdef __linux__ -/* libcfs.h is not really needed here, but on SLES10/PPC, fs.h includes idr.h - * which requires BITS_PER_LONG to be defined */ -#include -#ifndef BLKGETSIZE64 -#include /* for BLKGETSIZE64 */ -#endif -#include -#endif +#include #include #include #include @@ -85,8 +77,8 @@ char *progname; int verbose = 1; +int version; static int print_only = 0; -static int upgrade_to_18 = 0; #ifdef HAVE_LDISKFS_OSD #define FSLIST_LDISKFS "ldiskfs" @@ -113,7 +105,6 @@ static int upgrade_to_18 = 0; void usage(FILE *out) { - fprintf(out, "%s v"LUSTRE_VERSION_STRING"\n", progname); fprintf(out, "usage: %s [--backfstype="FSLIST"] " "--fsname=\n" "\t--index= [options] \n", progname); @@ -161,6 +152,7 @@ void usage(FILE *out) "\t\t--device-size=#N(KB): device size for loop devices\n" "\t\t--mkfsoptions=: format options\n" "\t\t--reformat: overwrite an existing disk\n" + "\t\t--replace: replace an old target with the same index\n" "\t\t--stripe-count-hint=#N: for optimizing MDT inode size\n" #else "\t\t--erase-params: erase all old parameter settings\n" @@ -171,6 +163,8 @@ void usage(FILE *out) "\t\t--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; @@ -191,7 +185,7 @@ void print_ldd(char *str, struct lustre_disk_data *ldd) printf("Lustre FS: %s\n", ldd->ldd_fsname); printf("Mount type: %s\n", MT_STR(ldd)); printf("Flags: %#x\n", ldd->ldd_flags); - printf(" (%s%s%s%s%s%s%s%s%s%s)\n", + printf(" (%s%s%s%s%s%s%s%s%s)\n", IS_MDT(ldd) ? "MDT ":"", IS_OST(ldd) ? "OST ":"", IS_MGS(ldd) ? "MGS ":"", @@ -199,7 +193,6 @@ void print_ldd(char *str, struct lustre_disk_data *ldd) ldd->ldd_flags & LDD_F_VIRGIN ? "first_time ":"", ldd->ldd_flags & LDD_F_UPDATE ? "update ":"", ldd->ldd_flags & LDD_F_WRITECONF ? "writeconf ":"", - ldd->ldd_flags & LDD_F_IAM_DIR ? "IAM_dir_format ":"", ldd->ldd_flags & LDD_F_NO_PRIMNODE? "no_primnode ":"", ldd->ldd_flags & LDD_F_UPGRADE14 ? "upgrade1.4 ":""); printf("Persistent mount opts: %s\n", ldd->ldd_mount_opts); @@ -258,8 +251,8 @@ static char *convert_hostnames(char *s1) *s2 = sep; if (nid == LNET_NID_ANY) { - fprintf(stderr, "%s: Can't parse NID '%s'\n", - progname, s1); + fprintf(stderr, "%s: Cannot resolve hostname '%s'.\n", + progname, s1); free(converted); return NULL; } @@ -283,54 +276,52 @@ static char *convert_hostnames(char *s1) int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop, char **mountopts) { - static struct option long_opt[] = { - {"iam-dir", 0, 0, 'a'}, - {"backfstype", 1, 0, 'b'}, - {"stripe-count-hint", 1, 0, 'c'}, - {"comment", 1, 0, 'u'}, - {"configdev", 1, 0, 'C'}, - {"device-size", 1, 0, 'd'}, - {"dryrun", 0, 0, 'n'}, - {"erase-params", 0, 0, 'e'}, - {"failnode", 1, 0, 'f'}, - {"failover", 1, 0, 'f'}, - {"mgs", 0, 0, 'G'}, - {"help", 0, 0, 'h'}, - {"index", 1, 0, 'i'}, - {"mkfsoptions", 1, 0, 'k'}, - {"mgsnode", 1, 0, 'm'}, - {"mgsnid", 1, 0, 'm'}, - {"mdt", 0, 0, 'M'}, - {"fsname",1, 0, 'L'}, - {"noformat", 0, 0, 'n'}, - {"nomgs", 0, 0, 'N'}, - {"mountfsoptions", 1, 0, 'o'}, - {"ost", 0, 0, 'O'}, - {"param", 1, 0, 'p'}, - {"print", 0, 0, 'n'}, - {"quiet", 0, 0, 'q'}, - {"reformat", 0, 0, 'r'}, - {"servicenode", 1, 0, 's'}, - {"verbose", 0, 0, 'v'}, - {"writeconf", 0, 0, 'w'}, - {"upgrade_to_18", 0, 0, 'U'}, - {"network", 1, 0, 't'}, - {"quota", 0, 0, 'Q'}, - {0, 0, 0, 0} - }; - char *optstring = "b:c:C:d:ef:Ghi:k:L:m:MnNo:Op:Pqrs:t:Uu:vw"; - int opt; - int rc, longidx; - int failnode_set = 0, servicenode_set = 0; + static struct option long_opt[] = { + { "backfstype", required_argument, NULL, 'b' }, + { "stripe-count-hint", required_argument, NULL, 'c' }, + { "comment", required_argument, NULL, 'u' }, + { "configdev", required_argument, NULL, 'C' }, + { "device-size", required_argument, NULL, 'd' }, + { "dryrun", no_argument, NULL, 'n' }, + { "erase-params", no_argument, NULL, 'e' }, + { "failnode", required_argument, NULL, 'f' }, + { "failover", required_argument, NULL, 'f' }, + { "mgs", no_argument, NULL, 'G' }, + { "help", no_argument, NULL, 'h' }, + { "index", required_argument, NULL, 'i' }, + { "mkfsoptions", required_argument, NULL, 'k' }, + { "mgsnode", required_argument, NULL, 'm' }, + { "mgsnid", required_argument, NULL, 'm' }, + { "mdt", no_argument, NULL, 'M' }, + { "fsname", required_argument, NULL, 'L' }, + { "noformat", no_argument, NULL, 'n' }, + { "nomgs", no_argument, NULL, 'N' }, + { "mountfsoptions", required_argument, NULL, 'o' }, + { "ost", no_argument, NULL, 'O' }, + { "param", required_argument, NULL, 'p' }, + { "print", no_argument, NULL, 'n' }, + { "quiet", no_argument, NULL, 'q' }, + { "quota", no_argument, NULL, 'Q' }, + { "reformat", no_argument, NULL, 'r' }, + { "replace", no_argument, NULL, 'R' }, + { "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: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) { switch (opt) { - case 'a': { - if (IS_MDT(&mop->mo_ldd)) - mop->mo_ldd.ldd_flags |= LDD_F_IAM_DIR; - break; - } case 'b': { int i = 0; while (i < LDD_MT_LAST) { @@ -365,9 +356,9 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop, //FIXME printf("Configdev not implemented\n"); return 1; - case 'd': - mop->mo_device_sz = atol(optarg); - break; + case 'd': + mop->mo_device_kb = atol(optarg); + break; case 'e': mop->mo_ldd.ldd_params[0] = '\0'; /* Must update the mgs logs */ @@ -388,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; @@ -411,20 +402,17 @@ 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; - } - if (IS_MDT(&mop->mo_ldd) || IS_OST(&mop->mo_ldd)) { - mop->mo_ldd.ldd_svindex = atol(optarg); - mop->mo_ldd.ldd_flags &= ~LDD_F_NEED_INDEX; - } else { - badopt(long_opt[longidx].name, "MDT,OST"); - 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': strscpy(mop->mo_mkfsopts, optarg, @@ -432,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); @@ -452,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; @@ -494,6 +475,9 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop, case 'r': mop->mo_flags |= MO_FORCEFORMAT; break; + case 'R': + replace = 1; + break; case 't': if (!IS_MDT(&mop->mo_ldd) && !IS_OST(&mop->mo_ldd)) { badopt(long_opt[longidx].name, "MDT,OST"); @@ -514,15 +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 'U': - upgrade_to_18 = 1; - 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; @@ -535,6 +521,27 @@ 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; + if (optind == argc) { /* The user didn't specify device name */ fatal(); @@ -555,13 +562,14 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop, int main(int argc, char *const argv[]) { - struct mkfs_opts mop; - struct lustre_disk_data *ldd; - char *mountopts = NULL; - char always_mountopts[512] = ""; - char default_mountopts[512] = ""; + struct mkfs_opts mop; + struct lustre_disk_data *ldd; + char *mountopts = NULL; + char always_mountopts[512] = ""; + char default_mountopts[512] = ""; unsigned mount_type; - int ret = 0; + int ret = 0; + int ret2 = 0; if ((progname = strrchr(argv[0], '/')) != NULL) progname++; @@ -579,6 +587,10 @@ int main(int argc, char *const argv[]) /* device is last arg */ strscpy(mop.mo_device, argv[argc - 1], sizeof(mop.mo_device)); + ret = osd_init(); + if (ret) + return ret; + #ifdef TUNEFS /* For tunefs, we must read in the old values before parsing any new ones. */ @@ -592,6 +604,7 @@ int main(int argc, char *const argv[]) ret = ENODEV; goto out; } + mop.mo_ldd.ldd_mount_type = mount_type; ret = osd_read_ldd(mop.mo_device, &mop.mo_ldd); if (ret) { @@ -602,20 +615,26 @@ int main(int argc, char *const argv[]) } mop.mo_ldd.ldd_flags &= ~(LDD_F_WRITECONF | LDD_F_VIRGIN); - if (strstr(mop.mo_ldd.ldd_params, PARAM_MGSNODE)) - mop.mo_mgs_failnodes++; + /* svname of the form lustre:OST1234 means never registered */ + ret = strlen(mop.mo_ldd.ldd_svname); + if (mop.mo_ldd.ldd_svname[ret - 8] == ':') { + mop.mo_ldd.ldd_svname[ret - 8] = '-'; + mop.mo_ldd.ldd_flags |= LDD_F_VIRGIN; + } else if (mop.mo_ldd.ldd_svname[ret - 8] == '=') { + mop.mo_ldd.ldd_svname[ret - 8] = '-'; + mop.mo_ldd.ldd_flags |= LDD_F_WRITECONF; + } - if (verbose > 0) - print_ldd("Read previous values", &(mop.mo_ldd)); -#endif + if (strstr(mop.mo_ldd.ldd_params, PARAM_MGSNODE)) + mop.mo_mgs_failnodes++; - ret = osd_init(); - if (ret) - return ret; + 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; @@ -633,9 +652,17 @@ int main(int argc, char *const argv[]) goto out; } - /* Stand alone MGS doesn't need a index */ - if (!IS_MDT(ldd) && IS_MGS(ldd)) + /* 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 */ + if (!(mop.mo_ldd.ldd_flags & LDD_F_NEED_INDEX)) { + badopt("index", "MDT,OST"); + goto out; + } +#endif mop.mo_ldd.ldd_flags &= ~LDD_F_NEED_INDEX; + } if ((mop.mo_ldd.ldd_flags & (LDD_F_NEED_INDEX | LDD_F_UPGRADE14)) == (LDD_F_NEED_INDEX | LDD_F_UPGRADE14)) { @@ -646,31 +673,25 @@ int main(int argc, char *const argv[]) goto out; } - if (IS_OST(ldd) && (mop.mo_ldd.ldd_flags & LDD_F_NEED_INDEX)) + if (mop.mo_ldd.ldd_flags & LDD_F_NEED_INDEX) fprintf(stderr, "warning: %s: for Lustre 2.4 and later, the " "target index must be specified with --index\n", mop.mo_device); -#if 0 - /* - * Comment out these 2 checks temporarily, since for multi-MDSes - * in single node only 1 mds node could have mgs service - */ - if (IS_MDT(ldd) && !IS_MGS(ldd) && (mop.mo_mgs_failnodes == 0)) { - verrprint("No management node specified, adding MGS to this " - "MDT\n"); - ldd->ldd_flags |= LDD_F_SV_TYPE_MGS; - } - if (!IS_MGS(ldd) && (mop.mo_mgs_failnodes == 0)) { - fatal(); - if (IS_MDT(ldd)) - fprintf(stderr, "Must specify --mgs or --mgsnode=\n"); - else - fprintf(stderr, "Must specify --mgsnode=\n"); - ret = EINVAL; - goto out; - } -#endif + /* If no index is supplied for MDT by default set index to zero */ + if (IS_MDT(ldd) && (ldd->ldd_svindex == INDEX_UNASSIGNED)) { + mop.mo_ldd.ldd_flags &= ~LDD_F_NEED_INDEX; + mop.mo_ldd.ldd_svindex = 0; + } + if (!IS_MGS(ldd) && (mop.mo_mgs_failnodes == 0)) { + fatal(); + if (IS_MDT(ldd)) + fprintf(stderr, "Must specify --mgs or --mgsnode\n"); + else + fprintf(stderr, "Must specify --mgsnode\n"); + ret = EINVAL; + goto out; + } if ((IS_MDT(ldd) || IS_OST(ldd)) && mop.mo_ldd.ldd_fsname[0] == '\0') { fatal(); fprintf(stderr, "Must specify --fsname for MDT/OST device\n"); @@ -792,8 +813,10 @@ int main(int argc, char *const argv[]) } out: - loop_cleanup(&mop); osd_fini(); + ret2 = loop_cleanup(&mop); + if (ret == 0) + ret = ret2; /* Fix any crazy return values from system() */ if (ret && ((ret & 255) == 0))