f6d5c04b79
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2084108 autofs can take 5 seconds or more to automount file systems in some cases. This is caused by the server probe logic attempting to connect to a server when it isn't available. Attempting to fix this problem introduced a regression where rpcbind was being consulted in a case where it shouldn't have been. This MR resolves these problems. Note that for NFSv4 mounts, if rpcbind is to be avoided then fallback to NFSv3 must be disabled. This has historically been done by using the "fstype=nfs4" automount option to requiest a specific nfs version. Resolves: rhbz#2084108 Signed-off-by: Ian Kent ikent@redhat.com
95 lines
3.5 KiB
Diff
95 lines
3.5 KiB
Diff
autofs-5.1.8 - fix nfsv4 only mounts should not use rpcbind
|
|
|
|
From: Ian Kent <raven@themaw.net>
|
|
|
|
Commit 606795ecfaa1 ("autofs-5.1.7 - also require TCP_REQUESTED when
|
|
setting NFS port" together with commit 26fb6b5408be) caused NFSv4 only
|
|
mounts to also use rpcbind to probe availability which breaks the
|
|
requirememt that this type of mount not use rpcbind at all.
|
|
|
|
Fix this by treating fstype=nfs4 mounts as a special case which doesn't
|
|
use rpcbind.
|
|
|
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
|
---
|
|
CHANGELOG | 1 +
|
|
include/replicated.h | 2 ++
|
|
modules/mount_nfs.c | 13 +++++++------
|
|
modules/replicated.c | 4 ++--
|
|
4 files changed, 12 insertions(+), 8 deletions(-)
|
|
|
|
--- autofs-5.1.7.orig/CHANGELOG
|
|
+++ autofs-5.1.7/CHANGELOG
|
|
@@ -100,6 +100,7 @@
|
|
- refactor get_nfs_info().
|
|
- also require TCP_REQUESTED when setting NFS port.
|
|
- bailout on rpc systemerror.
|
|
+- fix nfsv4 only mounts should not use rpcbind.
|
|
|
|
25/01/2021 autofs-5.1.7
|
|
- make bind mounts propagation slave by default.
|
|
--- autofs-5.1.7.orig/include/replicated.h
|
|
+++ autofs-5.1.7/include/replicated.h
|
|
@@ -35,6 +35,8 @@
|
|
#define NFS3_REQUESTED NFS3_SUPPORTED
|
|
#define NFS4_REQUESTED NFS4_SUPPORTED
|
|
|
|
+#define NFS4_ONLY_REQUESTED 0x0800
|
|
+
|
|
#define TCP_SUPPORTED 0x0001
|
|
#define UDP_SUPPORTED 0x0002
|
|
#define TCP_REQUESTED TCP_SUPPORTED
|
|
--- autofs-5.1.7.orig/modules/mount_nfs.c
|
|
+++ autofs-5.1.7/modules/mount_nfs.c
|
|
@@ -92,7 +92,7 @@ int mount_mount(struct autofs_point *ap,
|
|
mount_default_proto = defaults_get_mount_nfs_default_proto();
|
|
vers = NFS_VERS_DEFAULT | NFS_PROTO_DEFAULT;
|
|
if (strcmp(fstype, "nfs4") == 0)
|
|
- vers = NFS4_VERS_DEFAULT | TCP_SUPPORTED;
|
|
+ vers = NFS4_VERS_DEFAULT | TCP_SUPPORTED | NFS4_ONLY_REQUESTED;
|
|
else if (mount_default_proto == 4)
|
|
vers = vers | NFS4_VERS_DEFAULT;
|
|
|
|
@@ -157,15 +157,16 @@ int mount_mount(struct autofs_point *ap,
|
|
} else {
|
|
/* Is any version of NFSv4 in the options */
|
|
if (_strncmp("vers=4", cp, 6) == 0 ||
|
|
- _strncmp("nfsvers=4", cp, 9) == 0)
|
|
- vers = NFS4_VERS_MASK | TCP_SUPPORTED;
|
|
- else if (_strncmp("vers=3", cp, o_len) == 0 ||
|
|
+ _strncmp("nfsvers=4", cp, 9) == 0) {
|
|
+ vers &= ~(NFS_VERS_MASK);
|
|
+ vers |= NFS4_VERS_MASK | TCP_SUPPORTED | NFS4_ONLY_REQUESTED;
|
|
+ } else if (_strncmp("vers=3", cp, o_len) == 0 ||
|
|
_strncmp("nfsvers=3", cp, o_len) == 0) {
|
|
- vers &= ~(NFS4_VERS_MASK | NFS_VERS_MASK);
|
|
+ vers &= ~(NFS4_VERS_MASK | NFS_VERS_MASK | NFS4_ONLY_REQUESTED);
|
|
vers |= NFS3_REQUESTED;
|
|
} else if (_strncmp("vers=2", cp, o_len) == 0 ||
|
|
_strncmp("nfsvers=2", cp, o_len) == 0) {
|
|
- vers &= ~(NFS4_VERS_MASK | NFS_VERS_MASK);
|
|
+ vers &= ~(NFS4_VERS_MASK | NFS_VERS_MASK | NFS4_ONLY_REQUESTED);
|
|
vers |= NFS2_REQUESTED;
|
|
} else if (strstr(cp, "port=") == cp &&
|
|
o_len - 5 < 25) {
|
|
--- autofs-5.1.7.orig/modules/replicated.c
|
|
+++ autofs-5.1.7/modules/replicated.c
|
|
@@ -291,7 +291,7 @@ static unsigned int get_nfs_info(unsigne
|
|
|
|
rpc_info->proto = proto;
|
|
if (port < 0) {
|
|
- if ((version & NFS4_REQUESTED) && (version & TCP_REQUESTED))
|
|
+ if (version & NFS4_REQUESTED && (version & NFS4_ONLY_REQUESTED))
|
|
rpc_info->port = NFS_PORT;
|
|
else
|
|
port = 0;
|
|
@@ -525,7 +525,7 @@ static int get_vers_and_cost(unsigned lo
|
|
{
|
|
struct conn_info pm_info, rpc_info;
|
|
time_t timeout = RPC_TIMEOUT;
|
|
- unsigned int supported, vers = (NFS_VERS_MASK | NFS4_VERS_MASK);
|
|
+ unsigned int supported, vers = (NFS_VERS_MASK | NFS4_VERS_MASK | NFS4_ONLY_REQUESTED);
|
|
int ret = 0;
|
|
|
|
if (!check_address_proto(logopt, host, version))
|