aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2008-04-19 14:22:31 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2008-04-19 16:52:54 -0400
commit080a1f148df0615f7a610e4776dd8f3fb706f54f (patch)
treebf6f52a5a2974adee916c86a01ffdd3a739cf71f
parentb6ddf64ffe9d59577a9176856bb6fe69a539f573 (diff)
SUNRPC: Don't attempt to destroy expired RPCSEC_GSS credentials..
..and always destroy using a 'soft' RPC call. Destroying GSS credentials isn't mandatory; the server can always cope with a few credentials not getting destroyed in a timely fashion. This actually fixes a hang situation. Basically, some servers will decide that the client is crazy if it tries to destroy an RPC context for which they have sent an RPCSEC_GSS_CREDPROBLEM, and so will refuse to talk to it for a while. The regression therefor probably was introduced by commit 0df7fb74fbb709591301871a38aac7735a1d6583. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--net/sunrpc/auth_gss/auth_gss.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c
index d34f6dfc7516..55948cd5ea55 100644
--- a/net/sunrpc/auth_gss/auth_gss.c
+++ b/net/sunrpc/auth_gss/auth_gss.c
@@ -710,7 +710,7 @@ gss_destroying_context(struct rpc_cred *cred)
710 struct rpc_task *task; 710 struct rpc_task *task;
711 711
712 if (gss_cred->gc_ctx == NULL || 712 if (gss_cred->gc_ctx == NULL ||
713 gss_cred->gc_ctx->gc_proc == RPC_GSS_PROC_DESTROY) 713 test_and_clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags) == 0)
714 return 0; 714 return 0;
715 715
716 gss_cred->gc_ctx->gc_proc = RPC_GSS_PROC_DESTROY; 716 gss_cred->gc_ctx->gc_proc = RPC_GSS_PROC_DESTROY;
@@ -720,7 +720,7 @@ gss_destroying_context(struct rpc_cred *cred)
720 * by the RPC call or by the put_rpccred() below */ 720 * by the RPC call or by the put_rpccred() below */
721 get_rpccred(cred); 721 get_rpccred(cred);
722 722
723 task = rpc_call_null(gss_auth->client, cred, RPC_TASK_ASYNC); 723 task = rpc_call_null(gss_auth->client, cred, RPC_TASK_ASYNC|RPC_TASK_SOFT);
724 if (!IS_ERR(task)) 724 if (!IS_ERR(task))
725 rpc_put_task(task); 725 rpc_put_task(task);
726 726