mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
nfsd: Don't pass all of rqst into rqst_exp_find()
Rather than passing the whole rqst, pass the pieces that are actually needed. This makes the inputs to rqst_exp_find() more obvious. Signed-off-by: NeilBrown <neilb@suse.de> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
11673b2a91
commit
c55aeef776
@ -1164,19 +1164,35 @@ gss:
|
||||
return gssexp;
|
||||
}
|
||||
|
||||
/**
|
||||
* rqst_exp_find - Find an svc_export in the context of a rqst or similar
|
||||
* @reqp: The handle to be used to suspend the request if a cache-upcall is needed
|
||||
* If NULL, missing in-cache information will result in failure.
|
||||
* @net: The network namespace in which the request exists
|
||||
* @cl: default auth_domain to use for looking up the export
|
||||
* @gsscl: an alternate auth_domain defined using deprecated gss/krb5 format.
|
||||
* @fsid_type: The type of fsid to look for
|
||||
* @fsidv: The actual fsid to look up in the context of either client.
|
||||
*
|
||||
* Perform a lookup for @cl/@fsidv in the given @net for an export. If
|
||||
* none found and @gsscl specified, repeat the lookup.
|
||||
*
|
||||
* Returns an export, or an error pointer.
|
||||
*/
|
||||
struct svc_export *
|
||||
rqst_exp_find(struct svc_rqst *rqstp, int fsid_type, u32 *fsidv)
|
||||
rqst_exp_find(struct cache_req *reqp, struct net *net,
|
||||
struct auth_domain *cl, struct auth_domain *gsscl,
|
||||
int fsid_type, u32 *fsidv)
|
||||
{
|
||||
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
|
||||
struct svc_export *gssexp, *exp = ERR_PTR(-ENOENT);
|
||||
struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
||||
struct cache_detail *cd = nn->svc_export_cache;
|
||||
|
||||
if (rqstp->rq_client == NULL)
|
||||
if (!cl)
|
||||
goto gss;
|
||||
|
||||
/* First try the auth_unix client: */
|
||||
exp = exp_find(cd, rqstp->rq_client, fsid_type,
|
||||
fsidv, &rqstp->rq_chandle);
|
||||
exp = exp_find(cd, cl, fsid_type, fsidv, reqp);
|
||||
if (PTR_ERR(exp) == -ENOENT)
|
||||
goto gss;
|
||||
if (IS_ERR(exp))
|
||||
@ -1186,10 +1202,9 @@ rqst_exp_find(struct svc_rqst *rqstp, int fsid_type, u32 *fsidv)
|
||||
return exp;
|
||||
gss:
|
||||
/* Otherwise, try falling back on gss client */
|
||||
if (rqstp->rq_gssclient == NULL)
|
||||
if (!gsscl)
|
||||
return exp;
|
||||
gssexp = exp_find(cd, rqstp->rq_gssclient, fsid_type, fsidv,
|
||||
&rqstp->rq_chandle);
|
||||
gssexp = exp_find(cd, gsscl, fsid_type, fsidv, reqp);
|
||||
if (PTR_ERR(gssexp) == -ENOENT)
|
||||
return exp;
|
||||
if (!IS_ERR(exp))
|
||||
@ -1220,7 +1235,9 @@ struct svc_export *rqst_find_fsidzero_export(struct svc_rqst *rqstp)
|
||||
|
||||
mk_fsid(FSID_NUM, fsidv, 0, 0, 0, NULL);
|
||||
|
||||
return rqst_exp_find(rqstp, FSID_NUM, fsidv);
|
||||
return rqst_exp_find(&rqstp->rq_chandle, SVC_NET(rqstp),
|
||||
rqstp->rq_client, rqstp->rq_gssclient,
|
||||
FSID_NUM, fsidv);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -127,6 +127,8 @@ static inline struct svc_export *exp_get(struct svc_export *exp)
|
||||
cache_get(&exp->h);
|
||||
return exp;
|
||||
}
|
||||
struct svc_export * rqst_exp_find(struct svc_rqst *, int, u32 *);
|
||||
struct svc_export *rqst_exp_find(struct cache_req *reqp, struct net *net,
|
||||
struct auth_domain *cl, struct auth_domain *gsscl,
|
||||
int fsid_type, u32 *fsidv);
|
||||
|
||||
#endif /* NFSD_EXPORT_H */
|
||||
|
@ -2233,7 +2233,9 @@ nfsd4_getdeviceinfo(struct svc_rqst *rqstp,
|
||||
return nfserr_noent;
|
||||
}
|
||||
|
||||
exp = rqst_exp_find(rqstp, map->fsid_type, map->fsid);
|
||||
exp = rqst_exp_find(&rqstp->rq_chandle, SVC_NET(rqstp),
|
||||
rqstp->rq_client, rqstp->rq_gssclient,
|
||||
map->fsid_type, map->fsid);
|
||||
if (IS_ERR(exp)) {
|
||||
dprintk("%s: could not find device id\n", __func__);
|
||||
return nfserr_noent;
|
||||
|
@ -195,7 +195,9 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp)
|
||||
data_left -= len;
|
||||
if (data_left < 0)
|
||||
return error;
|
||||
exp = rqst_exp_find(rqstp, fh->fh_fsid_type, fh->fh_fsid);
|
||||
exp = rqst_exp_find(&rqstp->rq_chandle, SVC_NET(rqstp),
|
||||
rqstp->rq_client, rqstp->rq_gssclient,
|
||||
fh->fh_fsid_type, fh->fh_fsid);
|
||||
fid = (struct fid *)(fh->fh_fsid + len);
|
||||
|
||||
error = nfserr_stale;
|
||||
|
Loading…
Reference in New Issue
Block a user