summaryrefslogtreecommitdiffstats
path: root/sys/nfsserver
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2010-12-28 21:12:15 +0000
committerpjd <pjd@FreeBSD.org>2010-12-28 21:12:15 +0000
commit76df586660846da974a67d1c717de5882c47be94 (patch)
tree1ee23f19434571e9da9aaa1e2744a223ec346794 /sys/nfsserver
parentd9307a36882c75778990b4beb48298aedd14382c (diff)
downloadFreeBSD-src-76df586660846da974a67d1c717de5882c47be94.zip
FreeBSD-src-76df586660846da974a67d1c717de5882c47be94.tar.gz
ZFS might not return monotonically increasing directory offset cookies,
so turn off UFS-specific hack that assumes so in ZFS case. Before the change we can miss returning some directory entries to a NFS client. I believe that the hack should be moved to ufs_readdir(), but until we find somebody who will do it, turn it off for ZFS in NFS server code. Submitted by: rmacklem Discussed with: rmacklem, mckusick MFC after: 3 days
Diffstat (limited to 'sys/nfsserver')
-rw-r--r--sys/nfsserver/nfs_serv.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/nfsserver/nfs_serv.c b/sys/nfsserver/nfs_serv.c
index 1fd7047..eb14d12 100644
--- a/sys/nfsserver/nfs_serv.c
+++ b/sys/nfsserver/nfs_serv.c
@@ -2737,7 +2737,7 @@ nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
int v3 = (nfsd->nd_flag & ND_NFSV3);
u_quad_t off, toff, verf;
u_long *cookies = NULL, *cookiep; /* needs to be int64_t or off_t */
- int vfslocked;
+ int vfslocked, not_zfs;
nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
vfslocked = 0;
@@ -2801,6 +2801,7 @@ nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = 0;
goto nfsmout;
}
+ not_zfs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "zfs") != 0;
VOP_UNLOCK(vp, 0);
/*
@@ -2887,10 +2888,12 @@ again:
* skip over the records that precede the requested offset. This
* requires the assumption that file offset cookies monotonically
* increase.
+ * Since the offset cookies don't monotonically increase for ZFS,
+ * this is not done when ZFS is the file system.
*/
while (cpos < cend && ncookies > 0 &&
(dp->d_fileno == 0 || dp->d_type == DT_WHT ||
- ((u_quad_t)(*cookiep)) <= toff)) {
+ (not_zfs != 0 && ((u_quad_t)(*cookiep)) <= toff))) {
cpos += dp->d_reclen;
dp = (struct dirent *)cpos;
cookiep++;
@@ -3037,6 +3040,7 @@ nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
int usevget = 1, vfslocked;
struct componentname cn;
struct mount *mntp = NULL;
+ int not_zfs;
nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
vfslocked = 0;
@@ -3097,6 +3101,7 @@ nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = 0;
goto nfsmout;
}
+ not_zfs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "zfs") != 0;
VOP_UNLOCK(vp, 0);
vp_locked = 0;
rbuf = malloc(siz, M_TEMP, M_WAITOK);
@@ -3176,10 +3181,12 @@ again:
* skip over the records that precede the requested offset. This
* requires the assumption that file offset cookies monotonically
* increase.
+ * Since the offset cookies don't monotonically increase for ZFS,
+ * this is not done when ZFS is the file system.
*/
while (cpos < cend && ncookies > 0 &&
(dp->d_fileno == 0 || dp->d_type == DT_WHT ||
- ((u_quad_t)(*cookiep)) <= toff)) {
+ (not_zfs != 0 && ((u_quad_t)(*cookiep)) <= toff))) {
cpos += dp->d_reclen;
dp = (struct dirent *)cpos;
cookiep++;
OpenPOWER on IntegriCloud