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:
parent
2ea2209f07
commit
6c0a654dce
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue