提交 080a1f14 编写于 作者: T Trond Myklebust

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
0df7fb74.
Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 b6ddf64f
...@@ -710,7 +710,7 @@ gss_destroying_context(struct rpc_cred *cred) ...@@ -710,7 +710,7 @@ gss_destroying_context(struct rpc_cred *cred)
struct rpc_task *task; struct rpc_task *task;
if (gss_cred->gc_ctx == NULL || if (gss_cred->gc_ctx == NULL ||
gss_cred->gc_ctx->gc_proc == RPC_GSS_PROC_DESTROY) test_and_clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags) == 0)
return 0; return 0;
gss_cred->gc_ctx->gc_proc = RPC_GSS_PROC_DESTROY; gss_cred->gc_ctx->gc_proc = RPC_GSS_PROC_DESTROY;
...@@ -720,7 +720,7 @@ gss_destroying_context(struct rpc_cred *cred) ...@@ -720,7 +720,7 @@ gss_destroying_context(struct rpc_cred *cred)
* by the RPC call or by the put_rpccred() below */ * by the RPC call or by the put_rpccred() below */
get_rpccred(cred); get_rpccred(cred);
task = rpc_call_null(gss_auth->client, cred, RPC_TASK_ASYNC); task = rpc_call_null(gss_auth->client, cred, RPC_TASK_ASYNC|RPC_TASK_SOFT);
if (!IS_ERR(task)) if (!IS_ERR(task))
rpc_put_task(task); rpc_put_task(task);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册