svn commit: r252418 - user/attilio/vmobj-readlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs

Attilio Rao attilio at FreeBSD.org
Sun Jun 30 13:41:22 UTC 2013


Author: attilio
Date: Sun Jun 30 13:41:21 2013
New Revision: 252418
URL: http://svnweb.freebsd.org/changeset/base/252418

Log:
  Fix a mismerge of ZFS:
  page_busy() could lead to deadlocks when non valid pages were
  returned.
  
  Sponsored by:	EMC / Isilon storage division
  Reported by:	bapt

Modified:
  user/attilio/vmobj-readlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c

Modified: user/attilio/vmobj-readlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Sun Jun 30 13:32:02 2013	(r252417)
+++ user/attilio/vmobj-readlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Sun Jun 30 13:41:21 2013	(r252418)
@@ -350,12 +350,9 @@ page_busy(vnode_t *vp, int64_t start, in
 				continue;
 			}
 			vm_page_busy_rlock(pp);
-		} else if (!alloc) {
-			pp = NULL;
-			break;
-		}
-		if (pp == NULL) {
-			ASSERT(alloc);
+		} else if (pp == NULL) {
+			if (!alloc)
+				break;
 			pp = vm_page_alloc(obj, OFF_TO_IDX(start),
 			    VM_ALLOC_SYSTEM | VM_ALLOC_IFCACHED |
 			    VM_ALLOC_RBUSY);
@@ -366,11 +363,11 @@ page_busy(vnode_t *vp, int64_t start, in
 
 		if (pp != NULL) {
 			ASSERT3U(pp->valid, ==, VM_PAGE_BITS_ALL);
-			if (alloc) {
-				vm_object_pip_add(obj, 1);
-				pmap_remove_write(pp);
-				vm_page_clear_dirty(pp, off, nbytes);
-			}
+			if (!alloc)
+				break;
+			vm_object_pip_add(obj, 1);
+			pmap_remove_write(pp);
+			vm_page_clear_dirty(pp, off, nbytes);
 		}
 		break;
 	}


More information about the svn-src-user mailing list