diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-04-19 14:22:31 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-04-19 16:52:54 -0400 |
commit | 080a1f148df0615f7a610e4776dd8f3fb706f54f (patch) | |
tree | bf6f52a5a2974adee916c86a01ffdd3a739cf71f /net/sunrpc/auth_gss | |
parent | b6ddf64ffe9d59577a9176856bb6fe69a539f573 (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>
Diffstat (limited to 'net/sunrpc/auth_gss')
-rw-r--r-- | net/sunrpc/auth_gss/auth_gss.c | 4 |
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 | ||