diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-09-12 19:37:26 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2011-09-13 22:44:17 -0400 |
commit | 11fcee0293a6d9f0973e04f8b3fb6cd15a55bcce (patch) | |
tree | f8d823a811d5806db67fe145ee79e24b279183cb | |
parent | 2f1ddda1749a223d1a05e16dc6ea28632b9ec570 (diff) |
NFSD: Add a cache for fs_locations information
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
[ cel: since this is server-side, use nfsd4_ prefix instead of nfs4_ prefix. ]
[ cel: implement S_ISVTX filter in bfields-normal form ]
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r-- | fs/nfsd/nfsd.h | 7 | ||||
-rw-r--r-- | fs/nfsd/vfs.c | 18 |
2 files changed, 25 insertions, 0 deletions
diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h index 8da03e16ab35..58134a23fdfb 100644 --- a/fs/nfsd/nfsd.h +++ b/fs/nfsd/nfsd.h | |||
@@ -361,6 +361,13 @@ static inline u32 nfsd_suppattrs2(u32 minorversion) | |||
361 | #define NFSD_SUPPATTR_EXCLCREAT_WORD2 \ | 361 | #define NFSD_SUPPATTR_EXCLCREAT_WORD2 \ |
362 | NFSD_WRITEABLE_ATTRS_WORD2 | 362 | NFSD_WRITEABLE_ATTRS_WORD2 |
363 | 363 | ||
364 | extern int nfsd4_is_junction(struct dentry *dentry); | ||
365 | #else | ||
366 | static inline int nfsd4_is_junction(struct dentry *dentry) | ||
367 | { | ||
368 | return 0; | ||
369 | } | ||
370 | |||
364 | #endif /* CONFIG_NFSD_V4 */ | 371 | #endif /* CONFIG_NFSD_V4 */ |
365 | 372 | ||
366 | #endif /* LINUX_NFSD_NFSD_H */ | 373 | #endif /* LINUX_NFSD_NFSD_H */ |
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 75c35fa46155..4dd91283d039 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -168,6 +168,8 @@ int nfsd_mountpoint(struct dentry *dentry, struct svc_export *exp) | |||
168 | { | 168 | { |
169 | if (d_mountpoint(dentry)) | 169 | if (d_mountpoint(dentry)) |
170 | return 1; | 170 | return 1; |
171 | if (nfsd4_is_junction(dentry)) | ||
172 | return 1; | ||
171 | if (!(exp->ex_flags & NFSEXP_V4ROOT)) | 173 | if (!(exp->ex_flags & NFSEXP_V4ROOT)) |
172 | return 0; | 174 | return 0; |
173 | return dentry->d_inode != NULL; | 175 | return dentry->d_inode != NULL; |
@@ -592,6 +594,22 @@ nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry, struct nfs4_ac | |||
592 | return error; | 594 | return error; |
593 | } | 595 | } |
594 | 596 | ||
597 | #define NFSD_XATTR_JUNCTION_PREFIX XATTR_TRUSTED_PREFIX "junction." | ||
598 | #define NFSD_XATTR_JUNCTION_TYPE NFSD_XATTR_JUNCTION_PREFIX "type" | ||
599 | int nfsd4_is_junction(struct dentry *dentry) | ||
600 | { | ||
601 | struct inode *inode = dentry->d_inode; | ||
602 | |||
603 | if (inode == NULL) | ||
604 | return 0; | ||
605 | if (inode->i_mode & S_IXUGO) | ||
606 | return 0; | ||
607 | if (!(inode->i_mode & S_ISVTX)) | ||
608 | return 0; | ||
609 | if (vfs_getxattr(dentry, NFSD_XATTR_JUNCTION_TYPE, NULL, 0) <= 0) | ||
610 | return 0; | ||
611 | return 1; | ||
612 | } | ||
595 | #endif /* defined(CONFIG_NFSD_V4) */ | 613 | #endif /* defined(CONFIG_NFSD_V4) */ |
596 | 614 | ||
597 | #ifdef CONFIG_NFSD_V3 | 615 | #ifdef CONFIG_NFSD_V3 |