* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2012, Whamcloud, Inc.
+ * Copyright (c) 2011, 2013, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <lustre_ver.h>
#include <ctype.h>
#include <limits.h>
+#if LUSTRE_VERSION_CODE > OBD_OCD_VERSION(2, 10, 51, 0)
+/*
+ * LU-1783
+ * We only #include a kernel level include file here because
+ * important MS_ flag #defines are missing from the SLES version
+ * of sys/mount.h
+ * In the future if SLES updates sys/mount.h to have a more complete
+ * set of flag #defines we should stop including linux/fs.h
+ */
+#warn remove kernel include
+#else
+#include <linux/fs.h>
+#endif
#define MAXOPT 4096
#define MAX_RETRIES 99
}
}
#ifdef MS_STRICTATIME
- /* set strictatime to default if NOATIME or RELATIME
- not given explicit */
- if (!(*flagp & (MS_NOATIME | MS_RELATIME)))
- *flagp |= MS_STRICTATIME;
+#if LUSTRE_VERSION_CODE > OBD_OCD_VERSION(2, 10, 51, 0)
+/*
+ * LU-1783
+ * In the future when upstream fixes land in all supported kernels
+ * we should stop forcing MS_STRICTATIME in lustre mounts.
+ * We override the kernel level default of MS_RELATIME for now
+ * due to a kernel vfs level bug in atime updates that fails
+ * to reset timestamps from the future.
+ */
+#warn remove MS_STRICTATIME override
+#endif
+ /* set strictatime to default if NOATIME or RELATIME
+ not given explicit */
+ if (!(*flagp & (MS_NOATIME | MS_RELATIME)))
+ *flagp |= MS_STRICTATIME;
#endif
strcpy(orig_options, options);
free(options);
return 0;
}
+static int clear_update_ondisk(char *source, struct lustre_disk_data *ldd)
+{
+ char always_mountopts[512] = "";
+ char default_mountopts[512] = "";
+ struct mkfs_opts mkop;
+ int ret;
+
+ memset(&mkop, 0, sizeof(mkop));
+ mkop.mo_ldd = *ldd;
+ mkop.mo_ldd.ldd_flags &= ~LDD_F_UPDATE;
+ if (strlen(source) > sizeof(mkop.mo_device)-1) {
+ fatal();
+ fprintf(stderr, "Device name too long: %s\n", source);
+ return -E2BIG;
+ }
+ strncpy(mkop.mo_device, source, sizeof(mkop.mo_device));
+
+ ret = osd_prepare_lustre(&mkop,
+ default_mountopts, sizeof(default_mountopts),
+ always_mountopts, sizeof(always_mountopts));
+ if (ret) {
+ fatal();
+ fprintf(stderr, "Can't prepare device %s: %s\n",
+ source, strerror(ret));
+ return ret;
+ }
+
+ /* Create the loopback file */
+ if (mkop.mo_flags & MO_IS_LOOP) {
+ ret = access(mkop.mo_device, F_OK);
+ if (ret) {
+ ret = errno;
+ fatal();
+ fprintf(stderr, "Can't access device %s: %s\n",
+ source, strerror(ret));
+ return ret;
+ }
+
+ ret = loop_setup(&mkop);
+ if (ret) {
+ fatal();
+ fprintf(stderr, "Loop device setup for %s failed: %s\n",
+ mkop.mo_device, strerror(ret));
+ return ret;
+ }
+ }
+ ret = osd_write_ldd(&mkop);
+ if (ret != 0) {
+ fatal();
+ fprintf(stderr, "failed to write local files: %s\n",
+ strerror(ret));
+ }
+ loop_cleanup(&mkop);
+
+ return ret;
+}
+
static int parse_ldd(char *source, struct mount_opts *mop, char *options)
{
struct lustre_disk_data *ldd = &mop->mo_ldd;
rc = osd_read_ldd(source, ldd);
if (rc) {
fprintf(stderr, "%s: %s failed to read permanent mount"
- " data: %s\n", progname, source, strerror(rc));
+ " data: %s\n", progname, source,
+ rc >= 0 ? strerror(rc) : "");
return rc;
}
- if (ldd->ldd_flags & LDD_F_NEED_INDEX) {
+ if ((IS_MDT(ldd) || IS_OST(ldd)) &&
+ (ldd->ldd_flags & LDD_F_NEED_INDEX)) {
fprintf(stderr, "%s: %s has no index assigned "
"(probably formatted with old mkfs)\n",
progname, source);
return EINVAL;
}
+ if (ldd->ldd_flags & LDD_F_UPDATE)
+ clear_update_ondisk(source, ldd);
+
/* Since we never rewrite ldd, ignore temp flags */
- ldd->ldd_flags &= ~(LDD_F_VIRGIN | LDD_F_UPDATE | LDD_F_WRITECONF);
+ ldd->ldd_flags &= ~(LDD_F_VIRGIN | LDD_F_WRITECONF);
/* svname of the form lustre:OST1234 means never registered */
rc = strlen(ldd->ldd_svname);
if (ldd->ldd_flags & LDD_F_VIRGIN)
append_option(options, "virgin");
+ if (ldd->ldd_flags & LDD_F_UPDATE)
+ append_option(options, "update");
if (ldd->ldd_flags & LDD_F_WRITECONF)
append_option(options, "writeconf");
if (ldd->ldd_flags & LDD_F_NO_PRIMNODE)
progname = strrchr(argv[0], '/');
progname = progname ? progname + 1 : argv[0];
- /*
- * LU-1279. When LNET modules have not loaded, and mounting multiple
- * targets at the same time could fail.
- */
- rc = system("/sbin/modprobe ptlrpc >/dev/null 2>&1");
-
set_defaults(&mop);
rc = osd_init();
for (i = 0, rc = -EAGAIN; i <= mop.mo_retry && rc != 0; i++) {
rc = mount(mop.mo_source, mop.mo_target, "lustre",
flags, (void *)options);
- if (rc) {
+ if (rc == 0) {
+ /* change label from <fsname>:<index> to
+ * <fsname>-<index> to indicate the device has
+ * been registered. only if the label is
+ * supposed to be changed and target service
+ * is supposed to start */
+ if (mop.mo_ldd.ldd_flags &
+ (LDD_F_VIRGIN | LDD_F_WRITECONF)) {
+ if (mop.mo_nosvc == 0)
+ (void)osd_label_lustre(&mop);
+ }
+ } else {
if (verbose) {
fprintf(stderr, "%s: mount %s at %s "
"failed: %s retries left: "
} else if (!mop.mo_nomtab) {
rc = update_mtab_entry(mop.mo_usource, mop.mo_target, "lustre",
mop.mo_orig_options, 0,0,0);
-
- /* change label from <fsname>:<index> to <fsname>-<index>
- * to indicate the device has been registered.
- * only if the label is supposed to be changed and
- * target service is supposed to start */
- if (mop.mo_ldd.ldd_flags & (LDD_F_VIRGIN | LDD_F_WRITECONF)) {
- if (mop.mo_nosvc == 0 )
- (void) osd_label_lustre(&mop);
- }
- }
+ }
free(options);
/* mo_usource should be freed, but we can rely on the kernel */