* 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, 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
+#include "mount_utils.h"
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include <ctype.h>
-#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 <libcfs/libcfs.h>
-#ifndef BLKGETSIZE64
-#include <linux/fs.h> /* for BLKGETSIZE64 */
-#endif
-#include <linux/version.h>
-#endif
#include <lustre_disk.h>
#include <lustre_param.h>
#include <lnet/lnetctl.h>
#include <lustre_ver.h>
-#include "mount_utils.h"
#ifndef PATH_MAX
#define PATH_MAX 4096
static int print_only = 0;
static int upgrade_to_18 = 0;
+#ifdef HAVE_LDISKFS_OSD
#define FSLIST_LDISKFS "ldiskfs"
#define HAVE_FSLIST
+#else
+ #define FSLIST_LDISKFS ""
+#endif /* HAVE_LDISKFS_OSD */
#ifdef HAVE_ZFS_OSD
#ifdef HAVE_FSLIST
#define FSLIST_ZFS "|zfs"
"\t\t--erase-params: erase all old parameter settings\n"
"\t\t--nomgs: turn off MGS service on this MDT\n"
"\t\t--writeconf: erase all config logs for this fs.\n"
+ "\t\t--quota: enable space accounting on old 2.x device.\n"
#endif
"\t\t--comment=<user comment>: arbitrary string (%d bytes)\n"
"\t\t--dryrun: report what we would do; don't write to disk\n"
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 ":"",
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);
mop->mo_ldd.ldd_magic = LDD_MAGIC;
mop->mo_ldd.ldd_config_ver = 1;
mop->mo_ldd.ldd_flags = LDD_F_NEED_INDEX | LDD_F_UPDATE | LDD_F_VIRGIN;
+#ifdef HAVE_LDISKFS_OSD
mop->mo_ldd.ldd_mount_type = LDD_MT_LDISKFS;
+#else
+ mop->mo_ldd.ldd_mount_type = LDD_MT_ZFS;
+#endif
mop->mo_ldd.ldd_svindex = INDEX_UNASSIGNED;
mop->mo_mgs_failnodes = 0;
mop->mo_stripe_count = 1;
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'},
{"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";
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) {
case 'U':
upgrade_to_18 = 1;
break;
+ case 'Q':
+ mop->mo_flags |= MO_QUOTA;
+ break;
default:
if (opt != '?') {
fatal();
/* 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. */
ret = ENODEV;
goto out;
}
+ mop.mo_ldd.ldd_mount_type = mount_type;
ret = osd_read_ldd(mop.mo_device, &mop.mo_ldd);
if (ret) {
"(%d)\n", mop.mo_device, ret);
goto out;
}
+ mop.mo_ldd.ldd_flags &= ~(LDD_F_WRITECONF | LDD_F_VIRGIN);
+
+ /* 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 (strstr(mop.mo_ldd.ldd_params, PARAM_MGSNODE))
mop.mo_mgs_failnodes++;
print_ldd("Read previous values", &(mop.mo_ldd));
#endif
- ret = osd_init();
- if (ret)
- return ret;
-
ret = parse_opts(argc, argv, &mop, &mountopts);
if (ret)
goto out;
goto out;
}
+ /* Stand alone MGS doesn't need a index */
+ if (!IS_MDT(ldd) && IS_MGS(ldd))
+ 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)) {
fatal();
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 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 0
/*
* Comment out these 2 checks temporarily, since for multi-MDSes
fprintf(stderr, "mkfs failed %d\n", ret);
goto out;
}
+#else
+ /* update svname with '=' to refresh config */
+ if (mop.mo_ldd.ldd_flags & LDD_F_WRITECONF) {
+ struct mount_opts opts;
+ opts.mo_ldd = mop.mo_ldd;
+ opts.mo_source = mop.mo_device;
+ (void) osd_label_lustre(&opts);
+ }
+
+ /* Enable quota accounting */
+ if (mop.mo_flags & MO_QUOTA) {
+ ret = osd_enable_quota(&mop);
+ goto out;
+ }
+
#endif
/* Write our config files */