Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3227fa41 authored by J. Bruce Fields's avatar J. Bruce Fields
Browse files

nfsd: filter readdir results in V4ROOT case



As with lookup, we treat every boject as a mountpoint and pretend it
doesn't exist if it isn't exported.

The preexisting code here is confusing, but I haven't yet figured out
how to make it clearer.

Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent 82ead7fe
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -2196,11 +2196,14 @@ nfsd4_encode_dirent_fattr(struct nfsd4_readdir *cd,
	 * we will not follow the cross mount and will fill the attribtutes
	 * directly from the mountpoint dentry.
	 */
	if (d_mountpoint(dentry) && !attributes_need_mount(cd->rd_bmval))
		ignore_crossmnt = 1;
	else if (d_mountpoint(dentry)) {
	if (nfsd_mountpoint(dentry, exp)) {
		int err;

		if (!(exp->ex_flags & NFSEXP_V4ROOT)
				&& !attributes_need_mount(cd->rd_bmval)) {
			ignore_crossmnt = 1;
			goto out_encode;
		}
		/*
		 * Why the heck aren't we just using nfsd_lookup??
		 * Different "."/".." handling?  Something else?
@@ -2216,6 +2219,7 @@ nfsd4_encode_dirent_fattr(struct nfsd4_readdir *cd,
			goto out_put;

	}
out_encode:
	nfserr = nfsd4_encode_fattr(NULL, exp, dentry, p, buflen, cd->rd_bmval,
					cd->rd_rqstp, ignore_crossmnt);
out_put:
+1 −1
Original line number Diff line number Diff line
@@ -170,7 +170,7 @@ static int nfsd_lookup_parent(struct svc_rqst *rqstp, struct dentry *dparent, st
 * For nfsd purposes, we treat V4ROOT exports as though there was an
 * export at *every* directory.
 */
static int nfsd_mountpoint(struct dentry *dentry, struct svc_export *exp)
int nfsd_mountpoint(struct dentry *dentry, struct svc_export *exp)
{
	if (d_mountpoint(dentry))
		return 1;
+1 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ __be32 nfsd_lookup_dentry(struct svc_rqst *, struct svc_fh *,
				struct svc_export **, struct dentry **);
__be32		nfsd_setattr(struct svc_rqst *, struct svc_fh *,
				struct iattr *, int, time_t);
int nfsd_mountpoint(struct dentry *, struct svc_export *);
#ifdef CONFIG_NFSD_V4
__be32          nfsd4_set_nfs4_acl(struct svc_rqst *, struct svc_fh *,
                    struct nfs4_acl *);