summaryrefslogtreecommitdiffstats
path: root/sys/fs/nfsserver
diff options
context:
space:
mode:
authorjpaetzel <jpaetzel@FreeBSD.org>2017-01-19 17:49:47 +0000
committerjpaetzel <jpaetzel@FreeBSD.org>2017-01-19 17:49:47 +0000
commitcc464351e36c4ef9350c2805ca1b10f991fe7aa6 (patch)
treefcadb0d0e0c07357a6aee56bddeb92e1a4201ae0 /sys/fs/nfsserver
parentb0f8a2e96e723cfbf60e4e3ec112cebd366a9771 (diff)
downloadFreeBSD-src-cc464351e36c4ef9350c2805ca1b10f991fe7aa6.zip
FreeBSD-src-cc464351e36c4ef9350c2805ca1b10f991fe7aa6.tar.gz
MFC 311122
Workaround NFS bug with readdirplus when there are greater than 1 billion files in a filesystem. Reviewed by: kib
Diffstat (limited to 'sys/fs/nfsserver')
-rw-r--r--sys/fs/nfsserver/nfs_nfsdport.c39
1 files changed, 11 insertions, 28 deletions
diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c
index a53fb5a..0704808 100644
--- a/sys/fs/nfsserver/nfs_nfsdport.c
+++ b/sys/fs/nfsserver/nfs_nfsdport.c
@@ -2018,25 +2018,17 @@ again:
}
/*
- * Check to see if entries in this directory can be safely acquired
- * via VFS_VGET() or if a switch to VOP_LOOKUP() is required.
- * ZFS snapshot directories need VOP_LOOKUP(), so that any
- * automount of the snapshot directory that is required will
- * be done.
- * This needs to be done here for NFSv4, since NFSv4 never does
- * a VFS_VGET() for "." or "..".
+ * For now ZFS requires VOP_LOOKUP as a workaround. Until ino_t is changed
+ * to 64 bit type a ZFS filesystem with over 1 billion files in it
+ * will suffer from 64bit -> 32bit truncation.
*/
- if (is_zfs == 1) {
- r = VFS_VGET(mp, at.na_fileid, LK_SHARED, &nvp);
- if (r == EOPNOTSUPP) {
- usevget = 0;
- cn.cn_nameiop = LOOKUP;
- cn.cn_lkflags = LK_SHARED | LK_RETRY;
- cn.cn_cred = nd->nd_cred;
- cn.cn_thread = p;
- } else if (r == 0)
- vput(nvp);
- }
+ if (is_zfs == 1)
+ usevget = 0;
+
+ cn.cn_nameiop = LOOKUP;
+ cn.cn_lkflags = LK_SHARED | LK_RETRY;
+ cn.cn_cred = nd->nd_cred;
+ cn.cn_thread = p;
/*
* Save this position, in case there is an error before one entry
@@ -2105,16 +2097,7 @@ again:
else
r = EOPNOTSUPP;
if (r == EOPNOTSUPP) {
- if (usevget) {
- usevget = 0;
- cn.cn_nameiop = LOOKUP;
- cn.cn_lkflags =
- LK_SHARED |
- LK_RETRY;
- cn.cn_cred =
- nd->nd_cred;
- cn.cn_thread = p;
- }
+ usevget = 0;
cn.cn_nameptr = dp->d_name;
cn.cn_namelen = nlen;
cn.cn_flags = ISLASTCN |
OpenPOWER on IntegriCloud