diff options
author | Neil Brown <neilb@suse.de> | 2008-07-16 13:15:46 -0400 |
---|---|---|
committer | Steve Dickson <steved@dickson.boston.devel.redhat.com> | 2008-07-16 13:15:46 -0400 |
commit | 8508942e7244017325690e2d0c17429fa0cb9873 (patch) | |
tree | b8731eafc4cffb5661022f456888c0a3aabfa5e5 | |
parent | 8e158aa65577b96494eaa94c4983eed1449116dc (diff) | |
download | nfs-utils-8508942e7244017325690e2d0c17429fa0cb9873.tar.gz nfs-utils-8508942e7244017325690e2d0c17429fa0cb9873.tar.xz nfs-utils-8508942e7244017325690e2d0c17429fa0cb9873.zip |
If an NFS server is only listening on TCP for portmap (as apparently
MS-Windows-Server2003R2SP2 does), mount doesn't cope. There is retry
logic in case the initial choice of version/etc doesn't work, but it
doesn't cope with mountd needing tcp.
So:
Fix probe_port so that a TIMEDOUT error doesn't simply abort
but probes with other protocols (e.g. tcp).
Fix rewrite_mount_options to extract the mountproto option before
doing a probe, then set mountproto (and mount prot) based
on the result.
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
-rw-r--r-- | utils/mount/network.c | 6 | ||||
-rw-r--r-- | utils/mount/stropts.c | 25 |
2 files changed, 29 insertions, 2 deletions
diff --git a/utils/mount/network.c b/utils/mount/network.c index 7d3d09a..75354a7 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -532,11 +532,10 @@ static int probe_port(clnt_addr_t *server, const unsigned long *versions, } if (clnt_ping(saddr, prog, *p_vers, *p_prot, NULL)) goto out_ok; - if (rpc_createerr.cf_stat == RPC_TIMEDOUT) - goto out_bad; } } if (rpc_createerr.cf_stat != RPC_PROGNOTREGISTERED && + rpc_createerr.cf_stat != RPC_TIMEDOUT && rpc_createerr.cf_stat != RPC_PROGVERSMISMATCH) goto out_bad; @@ -545,6 +544,9 @@ static int probe_port(clnt_addr_t *server, const unsigned long *versions, continue; p_prot = protos; } + if (rpc_createerr.cf_stat == RPC_TIMEDOUT) + goto out_bad; + if (vers || !*++p_vers) break; } diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index e4a4408..09fca86 100644 --- a/utils/mount/stropts.c +++ b/utils/mount/stropts.c @@ -353,6 +353,17 @@ static struct mount_options *nfs_rewrite_mount_options(char *str) option = po_get(options, "mountvers"); if (option) mnt_server.pmap.pm_vers = atoi(option); + option = po_get(options, "mountproto"); + if (option) { + if (strcmp(option, "tcp") == 0) { + mnt_server.pmap.pm_prot = IPPROTO_TCP; + po_remove_all(options, "mountproto"); + } + if (strcmp(option, "udp") == 0) { + mnt_server.pmap.pm_prot = IPPROTO_UDP; + po_remove_all(options, "mountproto"); + } + } option = po_get(options, "port"); if (option) { @@ -421,6 +432,20 @@ static struct mount_options *nfs_rewrite_mount_options(char *str) } + if (mnt_server.pmap.pm_prot == IPPROTO_TCP) + snprintf(new_option, sizeof(new_option) - 1, + "mountproto=tcp"); + else + snprintf(new_option, sizeof(new_option) - 1, + "mountproto=udp"); + if (po_append(options, new_option) == PO_FAILED) + goto err; + + snprintf(new_option, sizeof(new_option) - 1, + "mountport=%lu", mnt_server.pmap.pm_port); + if (po_append(options, new_option) == PO_FAILED) + goto err; + errno = 0; return options; |