diff options
| author | J. Bruce Fields <bfields@citi.umich.edu> | 2009-10-25 21:33:15 -0400 |
|---|---|---|
| committer | J. Bruce Fields <bfields@citi.umich.edu> | 2009-12-15 14:07:23 -0500 |
| commit | 82ead7fe41da960ed80652d13d5a1072f85f5aca (patch) | |
| tree | b4f870c1c6ef0e66ceca68be03a8e4eb3b139e2e | |
| parent | 3b6cee7bc4b2f7858e9202293104acda8826bb68 (diff) | |
nfsd: filter lookup results in V4ROOT case
We treat every object as a mountpoint and pretend it doesn't exist if
it isn't exported.
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
| -rw-r--r-- | fs/nfsd/vfs.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 7e2fdd50113f..eaf2f0dca12a 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
| @@ -166,6 +166,19 @@ static int nfsd_lookup_parent(struct svc_rqst *rqstp, struct dentry *dparent, st | |||
| 166 | return 0; | 166 | return 0; |
| 167 | } | 167 | } |
| 168 | 168 | ||
| 169 | /* | ||
| 170 | * For nfsd purposes, we treat V4ROOT exports as though there was an | ||
| 171 | * export at *every* directory. | ||
| 172 | */ | ||
| 173 | static int nfsd_mountpoint(struct dentry *dentry, struct svc_export *exp) | ||
| 174 | { | ||
| 175 | if (d_mountpoint(dentry)) | ||
| 176 | return 1; | ||
| 177 | if (!(exp->ex_flags & NFSEXP_V4ROOT)) | ||
| 178 | return 0; | ||
| 179 | return dentry->d_inode != NULL; | ||
| 180 | } | ||
| 181 | |||
| 169 | __be32 | 182 | __be32 |
| 170 | nfsd_lookup_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp, | 183 | nfsd_lookup_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp, |
| 171 | const char *name, unsigned int len, | 184 | const char *name, unsigned int len, |
| @@ -211,7 +224,7 @@ nfsd_lookup_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
| 211 | /* | 224 | /* |
| 212 | * check if we have crossed a mount point ... | 225 | * check if we have crossed a mount point ... |
| 213 | */ | 226 | */ |
| 214 | if (d_mountpoint(dentry)) { | 227 | if (nfsd_mountpoint(dentry, exp)) { |
| 215 | if ((host_err = nfsd_cross_mnt(rqstp, &dentry, &exp))) { | 228 | if ((host_err = nfsd_cross_mnt(rqstp, &dentry, &exp))) { |
| 216 | dput(dentry); | 229 | dput(dentry); |
| 217 | goto out_nfserr; | 230 | goto out_nfserr; |
