diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2009-12-03 15:58:56 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2009-12-03 15:58:56 -0500 |
commit | caabea8a565fb4e16f8e58e16bb9d535e591b709 (patch) | |
tree | 15e0cf4514999c4fb9596adece9e22adfaee2a31 /net/sunrpc/clnt.c | |
parent | 012da158f636347c4eb28fd1e1cca020fef5e54d (diff) |
SUNRPC: Use soft connect semantics when performing RPC ping
Currently, if a remote RPC service is unreachable, an RPC ping will
hang until the underlying transport connect attempt times out. A more
desirable behavior might be to have the ping fail immediately so upper
layers can recover appropriately.
In the case of an NFS mount, for instance, this would mean the
mount(2) system call could fail immediately if the server isn't
listening, rather than hanging uninterruptibly for more than 3
minutes.
Change rpc_ping() so that it fails immediately for connection-oriented
transports. rpc_create() will then fail immediately for such
transports if an RPC ping was requested.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/sunrpc/clnt.c')
-rw-r--r-- | net/sunrpc/clnt.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 4b76ef9336c7..97931d9f8579 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -79,7 +79,7 @@ static void call_connect_status(struct rpc_task *task); | |||
79 | 79 | ||
80 | static __be32 *rpc_encode_header(struct rpc_task *task); | 80 | static __be32 *rpc_encode_header(struct rpc_task *task); |
81 | static __be32 *rpc_verify_header(struct rpc_task *task); | 81 | static __be32 *rpc_verify_header(struct rpc_task *task); |
82 | static int rpc_ping(struct rpc_clnt *clnt, int flags); | 82 | static int rpc_ping(struct rpc_clnt *clnt); |
83 | 83 | ||
84 | static void rpc_register_client(struct rpc_clnt *clnt) | 84 | static void rpc_register_client(struct rpc_clnt *clnt) |
85 | { | 85 | { |
@@ -340,7 +340,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args) | |||
340 | return clnt; | 340 | return clnt; |
341 | 341 | ||
342 | if (!(args->flags & RPC_CLNT_CREATE_NOPING)) { | 342 | if (!(args->flags & RPC_CLNT_CREATE_NOPING)) { |
343 | int err = rpc_ping(clnt, RPC_TASK_SOFT); | 343 | int err = rpc_ping(clnt); |
344 | if (err != 0) { | 344 | if (err != 0) { |
345 | rpc_shutdown_client(clnt); | 345 | rpc_shutdown_client(clnt); |
346 | return ERR_PTR(err); | 346 | return ERR_PTR(err); |
@@ -528,7 +528,7 @@ struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *old, | |||
528 | clnt->cl_prog = program->number; | 528 | clnt->cl_prog = program->number; |
529 | clnt->cl_vers = version->number; | 529 | clnt->cl_vers = version->number; |
530 | clnt->cl_stats = program->stats; | 530 | clnt->cl_stats = program->stats; |
531 | err = rpc_ping(clnt, RPC_TASK_SOFT); | 531 | err = rpc_ping(clnt); |
532 | if (err != 0) { | 532 | if (err != 0) { |
533 | rpc_shutdown_client(clnt); | 533 | rpc_shutdown_client(clnt); |
534 | clnt = ERR_PTR(err); | 534 | clnt = ERR_PTR(err); |
@@ -1709,14 +1709,14 @@ static struct rpc_procinfo rpcproc_null = { | |||
1709 | .p_decode = rpcproc_decode_null, | 1709 | .p_decode = rpcproc_decode_null, |
1710 | }; | 1710 | }; |
1711 | 1711 | ||
1712 | static int rpc_ping(struct rpc_clnt *clnt, int flags) | 1712 | static int rpc_ping(struct rpc_clnt *clnt) |
1713 | { | 1713 | { |
1714 | struct rpc_message msg = { | 1714 | struct rpc_message msg = { |
1715 | .rpc_proc = &rpcproc_null, | 1715 | .rpc_proc = &rpcproc_null, |
1716 | }; | 1716 | }; |
1717 | int err; | 1717 | int err; |
1718 | msg.rpc_cred = authnull_ops.lookup_cred(NULL, NULL, 0); | 1718 | msg.rpc_cred = authnull_ops.lookup_cred(NULL, NULL, 0); |
1719 | err = rpc_call_sync(clnt, &msg, flags); | 1719 | err = rpc_call_sync(clnt, &msg, RPC_TASK_SOFT | RPC_TASK_SOFTCONN); |
1720 | put_rpccred(msg.rpc_cred); | 1720 | put_rpccred(msg.rpc_cred); |
1721 | return err; | 1721 | return err; |
1722 | } | 1722 | } |