Format options for the backing fs. For example, ext3 options could be set here.
.TP
.BI \--mountfsoptions= opts
-Set permanent mount options, equivalent to setting in /etc/fstab
+Set the mount options that will be used when mounting the backing fs.
+WARNING: unlike earlier versions of \fBmkfs.lustre\fR, this version completely
+replaces the default mount options with those specified on the command line,
+issuing a warning on stderr if any of the default mount options are omitted.
+The defaults for \fIldiskfs\fR are
+OST: \fIerrors=remount-ro,mballoc,extents\fR;
+MGS/MDT: \fIerrors=remount-ro,iopen_nopriv,user_xattr\fR.
+\fBDO NOT\fR alter the default mount options unless you know what you are doing.
.TP
.BI \--mgsnode= nid,...
Set the NID(s) of the MGS node, required for all targets other than the MGS.
Force a particular OST or MDT index
.TP
.BI \--mountfsoptions= opts
-Set permanent mount options, equivalent to setting in /etc/fstab
+Set the mount options that will be used when mounting the backing fs.
+WARNING: unlike earlier versions of \fBtunefs.lustre\fR, this version
+completely replaces the existing mount options with those specified on
+the command line, issuing a warning on stderr if any of the default
+mount options are omitted. The defaults for ldiskfs are
+OST: \fIerrors=remount-ro,mballoc,extents\fR;
+MGS/MDT: \fIerrors=remount-ro,iopen_nopriv,user_xattr\fR.
+\fBDO NOT\fR alter the default mount options unless you know what you are doing.
.TP
.BI \--mgs
Add a configuration management service to this target
#include <string.h>
#include <getopt.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
return 0;
}
+/* Search for opt in mntlist, returning true if found.
+ */
+static int in_mntlist(char *opt, char *mntlist)
+{
+ char *ml, *mlp, *item, *ctx;
+
+ if (!(ml = strdup(mntlist))) {
+ fprintf(stderr, "%s: out of memory\n", progname);
+ exit(1);
+ }
+ mlp = ml;
+ while ((item = strtok_r(mlp, ",", &ctx))) {
+ if (!strcmp(opt, item))
+ break;
+ mlp = NULL;
+ }
+ free(ml);
+ return (item != NULL);
+}
+
+/* Issue a message on stderr for every item in wanted_mountopts that is not
+ * present in mountopts. The justwarn boolean toggles between error and
+ * warning message. Return an error count.
+ */
+static int check_mountfsoptions(char *mountopts, char *wanted_mountopts,
+ int justwarn)
+{
+ char *ml, *mlp, *item, *ctx;
+ int errors = 0;
+
+ if (!(ml = strdup(wanted_mountopts))) {
+ fprintf(stderr, "%s: out of memory\n", progname);
+ exit(1);
+ }
+ mlp = ml;
+ while ((item = strtok_r(mlp, ",", &ctx))) {
+ if (!in_mntlist(item, mountopts)) {
+ fprintf(stderr, "%s: %s mount option `%s' is missing\n",
+ progname, justwarn ? "Warning: default"
+ : "Error: mandatory", item);
+ errors++;
+ }
+ mlp = NULL;
+ }
+ free(ml);
+ return errors;
+}
+
+/* Trim embedded white space, leading and trailing commas from string s.
+ */
+static void trim_mountfsoptions(char *s)
+{
+ char *p;
+
+ for (p = s; *p; ) {
+ if (isspace(*p)) {
+ memmove(p, p + 1, strlen(p + 1) + 1);
+ continue;
+ }
+ p++;
+ }
+
+ while (s[0] == ',')
+ memmove(&s[0], &s[1], strlen(&s[1]) + 1);
+
+ p = s + strlen(s) - 1;
+ while (p >= s && *p == ',')
+ *p-- = '\0';
+}
+
int main(int argc, char *const argv[])
{
struct mkfs_opts mop;
case LDD_MT_EXT3:
case LDD_MT_LDISKFS:
case LDD_MT_LDISKFS2: {
- sprintf(always_mountopts, "errors=remount-ro");
+ strscat(default_mountopts, ",errors=remount-ro",
+ sizeof(default_mountopts));
if (IS_MDT(ldd) || IS_MGS(ldd))
strscat(always_mountopts, ",iopen_nopriv,user_xattr",
sizeof(always_mountopts));
}
case LDD_MT_SMFS: {
mop.mo_flags |= MO_IS_LOOP;
- sprintf(always_mountopts, "type=ext3,dev=%s",
+ sprintf(always_mountopts, ",type=ext3,dev=%s",
mop.mo_device);
break;
}
}
if (mountopts) {
- /* If user specifies mount opts, don't use defaults,
- but always use always_mountopts */
- sprintf(ldd->ldd_mount_opts, "%s,%s",
- always_mountopts, mountopts);
+ trim_mountfsoptions(mountopts);
+ (void)check_mountfsoptions(mountopts, default_mountopts, 1);
+ if (check_mountfsoptions(mountopts, always_mountopts, 0)) {
+ ret = EINVAL;
+ goto out;
+ }
+ sprintf(ldd->ldd_mount_opts, "%s", mountopts);
} else {
#ifdef TUNEFS
if (ldd->ldd_mount_opts[0] == 0)
{
sprintf(ldd->ldd_mount_opts, "%s%s",
always_mountopts, default_mountopts);
+ trim_mountfsoptions(ldd->ldd_mount_opts);
}
}