* 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, 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 <lustre_ver.h>
#include <ctype.h>
#include <limits.h>
-#include "mount_utils.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
mop->mo_retry = 0;
} else if (val && strncmp(arg, "mgssec", 6) == 0) {
append_option(options, opt);
+ } else if (strncmp(arg, "nosvc", 5) == 0) {
+ mop->mo_nosvc = 1;
+ append_option(options, opt);
} else if (strcmp(opt, "force") == 0) {
//XXX special check for 'force' option
++mop->mo_force;
}
}
#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;
+ strcpy(mkop.mo_device, source);
+
+ 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;
+ char *cur, *start;
int rc;
rc = osd_is_lustre(source, &ldd->ldd_mount_type);
return ENODEV;
}
- /* for new backends (i.e. ZFS) we will be parsing mount data
- * in the userspace and pass it in the form of mount options.
- * to adopt this schema smoothly we're still doing old way
- * (parsing mount data within the kernel) for ldiskfs */
- if (ldd->ldd_mount_type == LDD_MT_EXT3 ||
- ldd->ldd_mount_type == LDD_MT_LDISKFS ||
- ldd->ldd_mount_type == LDD_MT_LDISKFS2)
- return 0;
-
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;
}
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->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_svname[rc - 8] == ':') {
ldd->ldd_svname[rc - 8] = '-';
ldd->ldd_flags |= LDD_F_VIRGIN;
+ } else if (ldd->ldd_svname[rc - 8] == '=') {
+ ldd->ldd_svname[rc - 8] = '-';
+ ldd->ldd_flags |= LDD_F_WRITECONF;
}
/* backend osd type */
return EINVAL;
}
- if (ldd->ldd_flags & (LDD_F_VIRGIN | LDD_F_WRITECONF))
+ 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_IAM_DIR)
- append_option(options, "iam");
if (ldd->ldd_flags & LDD_F_NO_PRIMNODE)
append_option(options, "noprimnode");
+ /* prefix every lustre parameter with param= so that in-kernel
+ * mount can recognize them properly and send to MGS at registration */
+ start = ldd->ldd_params;
+ while (start && *start != '\0') {
+ while (*start == ' ') start++;
+ if (*start == '\0')
+ break;
+ cur = start;
+ start = strchr(cur, ' ');
+ if (start) {
+ *start = '\0';
+ start++;
+ }
+ append_option(options, "param=");
+ strcat(options, cur);
+ }
+
/* svname must be last option */
append_option(options, "svname=");
strcat(options, ldd->ldd_svname);
mop->mo_have_mgsnid = 0;
mop->mo_md_stripe_cache_size = 16384;
mop->mo_orig_options = "";
+ mop->mo_nosvc = 0;
}
static int parse_opts(int argc, char *const argv[], struct mount_opts *mop)
* symbolic link for instance
*/
if (realpath(mop->mo_usource, real_path) != NULL) {
- mop->mo_usource = strdup(real_path);
-
ptr = strrchr(real_path, '/');
if (ptr && strncmp(ptr, "/dm-", 4) == 0 && isdigit(*(ptr + 4))) {
snprintf(path, sizeof(path), "/sys/block/%s/dm/name", ptr+1);
fclose(f);
}
}
+ mop->mo_usource = strdup(real_path);
}
ptr = strstr(mop->mo_usource, ":/");
fprintf(stderr, "%s: mount %s at %s failed: %s\n", progname,
mop.mo_usource, mop.mo_target, strerror(errno));
+ if (errno == EBUSY)
+ fprintf(stderr, "Is the backend filesystem mounted?\n"
+ "Check /etc/mtab and /proc/mounts\n");
if (errno == ENODEV)
fprintf(stderr, "Are the lustre modules loaded?\n"
"Check /etc/modprobe.conf and "
} 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);