| autofs-5.1.8 - fix nfsv4 only mounts should not use rpcbind |
| |
| From: Ian Kent <raven@xxxxxxxxxx> |
| |
| 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. |
| --- |
| CHANGELOG | 1 + |
| include/replicated.h | 2 ++ |
| modules/mount_nfs.c | 13 +++++++------ |
| modules/replicated.c | 4 ++-- |
| 4 files changed, 12 insertions(+), 8 deletions(-) |
| |
| diff --git a/include/replicated.h b/include/replicated.h |
| index 95ff1f0d..f889a56a 100644 |
| --- a/include/replicated.h |
| +++ b/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 |
| diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c |
| index 0ab87dcf..feb5afcd 100644 |
| --- a/modules/mount_nfs.c |
| +++ b/modules/mount_nfs.c |
| @@ -92,7 +92,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
| 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, const char *root, const char *name, int |
| } 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) { |
| diff --git a/modules/replicated.c b/modules/replicated.c |
| index 09075dd0..cdb7c617 100644 |
| --- a/modules/replicated.c |
| +++ b/modules/replicated.c |
| @@ -291,7 +291,7 @@ static unsigned int get_nfs_info(unsigned logopt, struct host *host, |
| |
| 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 logopt, struct host *host, |
| { |
| 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)) |