child; /* forked bg child? */
};
-inline void set_default_version(struct nfsmount_info *mi);
#ifdef MOUNT_CONFIG
-inline void set_default_version(struct nfsmount_info *mi)
+static void nfs_default_version(struct nfsmount_info *mi);
+
+static void nfs_default_version(struct nfsmount_info *mi)
{
extern unsigned long config_default_vers;
/*
}
}
#else
-inline void set_default_version(struct nfsmount_info *mi) {}
+inline void nfs_default_version(struct nfsmount_info *mi) {}
#endif /* MOUNT_CONFIG */
/*
return 0;
return 1;
}
+
+static int nfs_set_version(struct nfsmount_info *mi)
+{
+ if (!nfs_nfs_version(mi->options, &mi->version))
+ return 0;
+
+ if (strncmp(mi->type, "nfs4", 4) == 0)
+ mi->version = 4;
+ else {
+ char *option = po_get(mi->options, "proto");
+ if (option && strcmp(option, "rdma") == 0)
+ mi->version = 3;
+ }
+
+ /*
+ * If we still don't know, check for version-specific
+ * mount options.
+ */
+ if (mi->version == 0) {
+ if (po_contains(mi->options, "mounthost") ||
+ po_contains(mi->options, "mountaddr") ||
+ po_contains(mi->options, "mountvers") ||
+ po_contains(mi->options, "mountproto"))
+ mi->version = 3;
+ }
+
+ /*
+ * If enabled, see if the default version was
+ * set in the config file
+ */
+ nfs_default_version(mi);
+
+ return 1;
+}
+
/*
* Set up mandatory non-version specific NFS mount options.
*
if (!nfs_name_to_address(mi->hostname, sap, &mi->salen))
return 0;
- if (!nfs_nfs_version(mi->options, &mi->version))
+ if (!nfs_set_version(mi))
return 0;
- if (strncmp(mi->type, "nfs4", 4) == 0)
- mi->version = 4;
- else {
- char *option = po_get(mi->options, "proto");
- if (option && strcmp(option, "rdma") == 0)
- mi->version = 3;
- }
-
- /*
- * If enabled, see if the default version was
- * set in the config file
- */
- set_default_version(mi);
if (!nfs_append_sloppy_option(mi->options))
return 0;
}
if (mi->version == 0) {
+ if (po_contains(options, "mounthost") ||
+ po_contains(options, "mountaddr") ||
+ po_contains(options, "mountvers") ||
+ po_contains(options, "mountproto")) {
+ /*
+ * Since these mountd options are set assume version 3
+ * is wanted so error out with EPROTONOSUPPORT so the
+ * protocol negation starts with v3.
+ */
+ errno = EPROTONOSUPPORT;
+ goto out_fail;
+ }
if (po_append(options, "vers=4") == PO_FAILED) {
errno = EINVAL;
goto out_fail;
errno = EINVAL;
goto out_fail;
}
+
/*
* Update option string to be recorded in /etc/mtab.
*/
if (po_join(options, mi->extra_opts) == PO_FAILED) {
errno = ENOMEM;
- return 0;
+ goto out_fail;
}
result = nfs_sys_mount(mi, options);
if (linux_version_code() > MAKE_VERSION(2, 6, 31)) {
errno = 0;
result = nfs_try_mount_v4(mi);
- if (errno != EPROTONOSUPPORT)
- break;
+ if (errno != EPROTONOSUPPORT) {
+ /*
+ * To deal with legacy Linux servers that don't
+ * automatically export a pseudo root, retry
+ * ENOENT errors using version 3
+ */
+ if (errno != ENOENT)
+ break;
+ }
}
case 2:
case 3: