NFS: move credential expiry tracking out of SUNRPC into NFS.
NFS needs to know when a credential is about to expire so that it can modify write-back behaviour to finish the write inside the expiry time. It currently uses functions in SUNRPC code which make use of a fairly complex callback scheme and flags in the generic credientials. As I am working to discard the generic credentials, this has to change. This patch moves the logic into NFS, in part by finding and caching the low-level credential in the open_context. We then make direct cred-api calls on that. This makes the code much simpler and removes a dependency on generic rpc credentials. Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
committed by
Anna Schumaker
parent
1de7eea929
commit
ddf529eeed
@ -1233,9 +1233,12 @@ int
|
||||
nfs_key_timeout_notify(struct file *filp, struct inode *inode)
|
||||
{
|
||||
struct nfs_open_context *ctx = nfs_file_open_context(filp);
|
||||
struct rpc_auth *auth = NFS_SERVER(inode)->client->cl_auth;
|
||||
|
||||
return rpcauth_key_timeout_notify(auth, ctx->cred);
|
||||
if (nfs_ctx_key_to_expire(ctx, inode) &&
|
||||
!ctx->ll_cred)
|
||||
/* Already expired! */
|
||||
return -EACCES;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1244,8 +1247,23 @@ nfs_key_timeout_notify(struct file *filp, struct inode *inode)
|
||||
bool nfs_ctx_key_to_expire(struct nfs_open_context *ctx, struct inode *inode)
|
||||
{
|
||||
struct rpc_auth *auth = NFS_SERVER(inode)->client->cl_auth;
|
||||
struct rpc_cred *cred = ctx->ll_cred;
|
||||
struct auth_cred acred = {
|
||||
.cred = ctx->cred->cr_cred,
|
||||
};
|
||||
|
||||
return rpcauth_cred_key_to_expire(auth, ctx->cred);
|
||||
if (cred && !cred->cr_ops->crmatch(&acred, cred, 0)) {
|
||||
put_rpccred(cred);
|
||||
ctx->ll_cred = NULL;
|
||||
cred = NULL;
|
||||
}
|
||||
if (!cred)
|
||||
cred = auth->au_ops->lookup_cred(auth, &acred, 0);
|
||||
if (!cred || IS_ERR(cred))
|
||||
return true;
|
||||
ctx->ll_cred = cred;
|
||||
return !!(cred->cr_ops->crkey_timeout &&
|
||||
cred->cr_ops->crkey_timeout(cred));
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user