Commit c55aeef7 authored by NeilBrown's avatar NeilBrown Committed by Chuck Lever

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: default avatarNeilBrown <neilb@suse.de>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 11673b2a
...@@ -1164,19 +1164,35 @@ rqst_exp_get_by_name(struct svc_rqst *rqstp, struct path *path) ...@@ -1164,19 +1164,35 @@ rqst_exp_get_by_name(struct svc_rqst *rqstp, struct path *path)
return gssexp; 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 * 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 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; struct cache_detail *cd = nn->svc_export_cache;
if (rqstp->rq_client == NULL) if (!cl)
goto gss; goto gss;
/* First try the auth_unix client: */ /* First try the auth_unix client: */
exp = exp_find(cd, rqstp->rq_client, fsid_type, exp = exp_find(cd, cl, fsid_type, fsidv, reqp);
fsidv, &rqstp->rq_chandle);
if (PTR_ERR(exp) == -ENOENT) if (PTR_ERR(exp) == -ENOENT)
goto gss; goto gss;
if (IS_ERR(exp)) if (IS_ERR(exp))
...@@ -1186,10 +1202,9 @@ rqst_exp_find(struct svc_rqst *rqstp, int fsid_type, u32 *fsidv) ...@@ -1186,10 +1202,9 @@ rqst_exp_find(struct svc_rqst *rqstp, int fsid_type, u32 *fsidv)
return exp; return exp;
gss: gss:
/* Otherwise, try falling back on gss client */ /* Otherwise, try falling back on gss client */
if (rqstp->rq_gssclient == NULL) if (!gsscl)
return exp; return exp;
gssexp = exp_find(cd, rqstp->rq_gssclient, fsid_type, fsidv, gssexp = exp_find(cd, gsscl, fsid_type, fsidv, reqp);
&rqstp->rq_chandle);
if (PTR_ERR(gssexp) == -ENOENT) if (PTR_ERR(gssexp) == -ENOENT)
return exp; return exp;
if (!IS_ERR(exp)) if (!IS_ERR(exp))
...@@ -1220,7 +1235,9 @@ struct svc_export *rqst_find_fsidzero_export(struct svc_rqst *rqstp) ...@@ -1220,7 +1235,9 @@ struct svc_export *rqst_find_fsidzero_export(struct svc_rqst *rqstp)
mk_fsid(FSID_NUM, fsidv, 0, 0, 0, NULL); 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) ...@@ -127,6 +127,8 @@ static inline struct svc_export *exp_get(struct svc_export *exp)
cache_get(&exp->h); cache_get(&exp->h);
return exp; 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 */ #endif /* NFSD_EXPORT_H */
...@@ -2233,7 +2233,9 @@ nfsd4_getdeviceinfo(struct svc_rqst *rqstp, ...@@ -2233,7 +2233,9 @@ nfsd4_getdeviceinfo(struct svc_rqst *rqstp,
return nfserr_noent; 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)) { if (IS_ERR(exp)) {
dprintk("%s: could not find device id\n", __func__); dprintk("%s: could not find device id\n", __func__);
return nfserr_noent; return nfserr_noent;
......
...@@ -195,7 +195,9 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp) ...@@ -195,7 +195,9 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp)
data_left -= len; data_left -= len;
if (data_left < 0) if (data_left < 0)
return error; 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); fid = (struct fid *)(fh->fh_fsid + len);
error = nfserr_stale; error = nfserr_stale;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment