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

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
Loading
Loading
Loading
Loading
+26 −9
Original line number Diff line number Diff line
@@ -1164,19 +1164,35 @@ rqst_exp_get_by_name(struct svc_rqst *rqstp, struct path *path)
	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);
}

/*
+3 −1
Original line number Diff line number Diff line
@@ -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 */
+3 −1
Original line number Diff line number Diff line
@@ -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;
+3 −1
Original line number Diff line number Diff line
@@ -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;