summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2007-07-28 17:50:19 -0400
committerNeil Brown <neilb@suse.de>2007-07-30 16:12:53 +1000
commit897f581874255d363e00ef94534f6fced8dd2ba2 (patch)
tree244dce0e5dd307ef189925fe3af1a3c86d4da475
parenta3c8371b4f4cf9f0ff93ca040cac13dc4806ded9 (diff)
downloadnfs-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.c19
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: