/* 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  */
__be32 nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name, unsigned int len, struct svc_fh *resfh)
/* 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  */
__be32 nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name, unsigned 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;
	err = check_nfsd_access(exp, rqstp);
	if (err)
		goto out;
	err = fh_compose(resfh, exp, dentry, fhp);
	if (!err && !dentry->d_inode)
		err = nfserr_noent;
out:
	dput(dentry);
	exp_put(exp);
	return err;
}