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:
Родитель
2ea2209f07
Коммит
6c0a654dce
|
@ -135,21 +135,10 @@ out:
|
|||
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
|
||||
nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
|
||||
int len, struct svc_fh *resfh)
|
||||
nfsd_lookup_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
const char *name, int len,
|
||||
struct svc_export **exp_ret, struct dentry **dentry_ret)
|
||||
{
|
||||
struct svc_export *exp;
|
||||
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
|
||||
* 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)
|
||||
err = nfserr_noent;
|
||||
dput(dentry);
|
||||
out:
|
||||
exp_put(exp);
|
||||
return err;
|
||||
|
||||
out_nfserr:
|
||||
err = nfserrno(host_err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Set various file attributes.
|
||||
* N.B. After this call fhp needs an fh_put
|
||||
|
|
Загрузка…
Ссылка в новой задаче