knfsd: nfsd: factor nfsd_lookup into 2 pieces

Factor nfsd_lookup into nfsd_lookup_dentry, which finds the right dentry and
export, and a second part which composes the filehandle (and which will later
check the security flavor on the new export).

No change in behavior.

Signed-off-by: "J. Bruce Fields" <bfields@citi.umich.edu>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
J. Bruce Fields 2007-07-17 04:04:47 -07:00 committed by Linus Torvalds
parent 2ea2209f07
commit 6c0a654dce
1 changed files with 36 additions and 19 deletions

View File

@ -135,21 +135,10 @@ out:
return err; return err;
} }
/*
* Look up one component of a pathname.
* N.B. After this call _both_ fhp and resfh need an fh_put
*
* If the lookup would cross a mountpoint, and the mounted filesystem
* is exported to the client with NFSEXP_NOHIDE, then the lookup is
* accepted as it stands and the mounted directory is
* returned. Otherwise the covered directory is returned.
* NOTE: this mountpoint crossing is not supported properly by all
* clients and is explicitly disallowed for NFSv3
* NeilBrown <neilb@cse.unsw.edu.au>
*/
__be32 __be32
nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name, nfsd_lookup_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp,
int len, struct svc_fh *resfh) const char *name, int len,
struct svc_export **exp_ret, struct dentry **dentry_ret)
{ {
struct svc_export *exp; struct svc_export *exp;
struct dentry *dparent; struct dentry *dparent;
@ -219,6 +208,38 @@ nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
} }
} }
} }
*dentry_ret = dentry;
*exp_ret = exp;
return 0;
out_nfserr:
exp_put(exp);
return nfserrno(host_err);
}
/*
* Look up one component of a pathname.
* N.B. After this call _both_ fhp and resfh need an fh_put
*
* If the lookup would cross a mountpoint, and the mounted filesystem
* is exported to the client with NFSEXP_NOHIDE, then the lookup is
* accepted as it stands and the mounted directory is
* returned. Otherwise the covered directory is returned.
* NOTE: this mountpoint crossing is not supported properly by all
* clients and is explicitly disallowed for NFSv3
* NeilBrown <neilb@cse.unsw.edu.au>
*/
__be32
nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
int len, struct svc_fh *resfh)
{
struct svc_export *exp;
struct dentry *dentry;
__be32 err;
err = nfsd_lookup_dentry(rqstp, fhp, name, len, &exp, &dentry);
if (err)
return err;
/* /*
* Note: we compose the file handle now, but as the * Note: we compose the file handle now, but as the
* dentry may be negative, it may need to be updated. * dentry may be negative, it may need to be updated.
@ -227,15 +248,11 @@ nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
if (!err && !dentry->d_inode) if (!err && !dentry->d_inode)
err = nfserr_noent; err = nfserr_noent;
dput(dentry); dput(dentry);
out:
exp_put(exp); exp_put(exp);
return err; return err;
out_nfserr:
err = nfserrno(host_err);
goto out;
} }
/* /*
* Set various file attributes. * Set various file attributes.
* N.B. After this call fhp needs an fh_put * N.B. After this call fhp needs an fh_put