svn commit: r219404 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs

Pawel Jakub Dawidek pjd at FreeBSD.org
Tue Mar 8 18:39:42 UTC 2011


Author: pjd
Date: Tue Mar  8 18:39:41 2011
New Revision: 219404
URL: http://svn.freebsd.org/changeset/base/219404

Log:
  Correct readdir over ZFS handling.
  
  Reported by:	Pierre Beyssac <pb at fasterix.frmug.org>
  MFC after:	1 month

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Tue Mar  8 17:43:35 2011	(r219403)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Tue Mar  8 18:39:41 2011	(r219404)
@@ -2394,7 +2394,8 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cre
 		 * Minimum entry size is dirent size and 1 byte for a file name.
 		 */
 		ncooks = uio->uio_resid / (sizeof(struct dirent) - sizeof(((struct dirent *)NULL)->d_name) + 1);
-		*cookies = malloc(ncooks * sizeof(u_long), M_TEMP, M_WAITOK);
+		cooks = malloc(ncooks * sizeof(u_long), M_TEMP, M_WAITOK);
+		*cookies = cooks;
 		*ncookies = ncooks;
 	}
 	/*
@@ -2541,16 +2542,6 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cre
 		if (prefetch)
 			dmu_prefetch(os, objnum, 0, 0);
 
-		if (ncookies != NULL) {
-			if (cooks == NULL)
-				cooks = *cookies;
-			else {
-				*cooks++ = offset;
-				ncooks--;
-				KASSERT(ncooks >= 0, ("ncookies=%d", ncooks));
-			}
-		}
-
 	skip_entry:
 		/*
 		 * Move to the next entry, fill in the previous offset.
@@ -2561,6 +2552,12 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cre
 		} else {
 			offset += 1;
 		}
+
+		if (cooks != NULL) {
+			*cooks++ = offset;
+			ncooks--;
+			KASSERT(ncooks >= 0, ("ncookies=%d", ncooks));
+		}
 	}
 	zp->z_zn_prefetch = B_FALSE; /* a lookup will re-enable pre-fetching */
 


More information about the svn-src-head mailing list