SUNRPC handle EKEYEXPIRED in call_refreshresult
Currently, when an RPCSEC_GSS context has expired or is non-existent and the users (Kerberos) credentials have also expired or are non-existent, the client receives the -EKEYEXPIRED error and tries to refresh the context forever. If an application is performing I/O, or other work against the share, the application hangs, and the user is not prompted to refresh/establish their credentials. This can result in a denial of service for other users. Users are expected to manage their Kerberos credential lifetimes to mitigate this issue. Move the -EKEYEXPIRED handling into the RPC layer. Try tk_cred_retry number of times to refresh the gss_context, and then return -EACCES to the application. Signed-off-by: Andy Adamson <andros@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:

committed by
Trond Myklebust

parent
620038f6d2
commit
eb96d5c97b
@@ -333,7 +333,6 @@ static int nfs4_handle_exception(struct nfs_server *server, int errorcode, struc
|
||||
}
|
||||
case -NFS4ERR_GRACE:
|
||||
case -NFS4ERR_DELAY:
|
||||
case -EKEYEXPIRED:
|
||||
ret = nfs4_delay(server->client, &exception->timeout);
|
||||
if (ret != 0)
|
||||
break;
|
||||
@@ -1343,13 +1342,6 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state
|
||||
nfs_inode_find_state_and_recover(state->inode,
|
||||
stateid);
|
||||
nfs4_schedule_stateid_recovery(server, state);
|
||||
case -EKEYEXPIRED:
|
||||
/*
|
||||
* User RPCSEC_GSS context has expired.
|
||||
* We cannot recover this stateid now, so
|
||||
* skip it and allow recovery thread to
|
||||
* proceed.
|
||||
*/
|
||||
case -ENOMEM:
|
||||
err = 0;
|
||||
goto out;
|
||||
@@ -3946,7 +3938,6 @@ nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server,
|
||||
case -NFS4ERR_DELAY:
|
||||
nfs_inc_server_stats(server, NFSIOS_DELAY);
|
||||
case -NFS4ERR_GRACE:
|
||||
case -EKEYEXPIRED:
|
||||
rpc_delay(task, NFS4_POLL_RETRY_MAX);
|
||||
task->tk_status = 0;
|
||||
return -EAGAIN;
|
||||
@@ -4946,15 +4937,6 @@ int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl)
|
||||
nfs4_schedule_stateid_recovery(server, state);
|
||||
err = 0;
|
||||
goto out;
|
||||
case -EKEYEXPIRED:
|
||||
/*
|
||||
* User RPCSEC_GSS context has expired.
|
||||
* We cannot recover this stateid now, so
|
||||
* skip it and allow recovery thread to
|
||||
* proceed.
|
||||
*/
|
||||
err = 0;
|
||||
goto out;
|
||||
case -ENOMEM:
|
||||
case -NFS4ERR_DENIED:
|
||||
/* kill_proc(fl->fl_pid, SIGLOST, 1); */
|
||||
|
Reference in New Issue
Block a user