diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2007-07-28 17:50:19 -0400 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2007-07-30 16:12:53 +1000 |
commit | 897f581874255d363e00ef94534f6fced8dd2ba2 (patch) | |
tree | 244dce0e5dd307ef189925fe3af1a3c86d4da475 | |
parent | a3c8371b4f4cf9f0ff93ca040cac13dc4806ded9 (diff) | |
download | nfs-utils-897f581874255d363e00ef94534f6fced8dd2ba2.tar.gz nfs-utils-897f581874255d363e00ef94534f6fced8dd2ba2.tar.xz nfs-utils-897f581874255d363e00ef94534f6fced8dd2ba2.zip |
mount.nfs: fix hang when getport() uses TCP against unavailable servers
If get_socket() can't get us an open TCP socket, we know the server is
down, so make getport() exit early instead of hanging. This logic is
copied from clnt_ping().
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Neil Brown <neilb@suse.de>
-rw-r--r-- | utils/mount/network.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/utils/mount/network.c b/utils/mount/network.c index 21cf4ef..5653302 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -135,8 +135,23 @@ unsigned short getport(struct sockaddr_in *saddr, unsigned long prog, struct pmap parms; enum clnt_stat stat; - saddr->sin_port = htons (PMAPPORT); - socket = get_socket(saddr, prot, FALSE, FALSE); + saddr->sin_port = htons(PMAPPORT); + + /* + * Try to get a socket with a non-privileged port. + * clnt*create() will create one anyway if this + * fails. + */ + socket = get_socket(saddr, proto, FALSE, FALSE); + if (socket == RPC_ANYSOCK) { + if (proto == IPPROTO_TCP && errno == ETIMEDOUT) { + /* + * TCP SYN timed out, so exit now. + */ + rpc_createerr.cf_stat = RPC_TIMEDOUT; + } + return 0; + } switch (prot) { case IPPROTO_UDP: |