svn commit: r200970 - user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs

Kip Macy kmacy at FreeBSD.org
Thu Dec 24 23:26:03 UTC 2009


Author: kmacy
Date: Thu Dec 24 23:26:02 2009
New Revision: 200970
URL: http://svn.freebsd.org/changeset/base/200970

Log:
  - replace page validation with vm_pages_valid_locked
  - move vm_pages_valid up before first use
  - remove stale comment

Modified:
  user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c

Modified: user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c
==============================================================================
--- user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c	Thu Dec 24 21:54:44 2009	(r200969)
+++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c	Thu Dec 24 23:26:02 2009	(r200970)
@@ -244,6 +244,35 @@ zio_spa_state_alloc(spa_t *spa)
 	return (zss);
 }
 
+/*
+ * scan blkno + size range in object to verify that all the pages are
+ * resident and valid
+ */
+static int
+vm_pages_valid_locked(vm_object_t object, uint64_t blkno, uint64_t size)
+{
+	vm_page_t m;
+	uint64_t i;
+
+	for (i = stob(blkno); i < stob(blkno) + size; i += PAGE_SIZE)
+		if ((m = vm_page_lookup(object, OFF_TO_IDX(i))) == NULL ||
+		    (m->valid != VM_PAGE_BITS_ALL))
+			return (0);
+	return (1);
+}
+
+static int
+vm_pages_valid(vm_object_t object, uint64_t blkno, uint64_t size)
+{
+	int valid;
+
+	VM_OBJECT_LOCK(object);
+	valid = vm_pages_valid_locked(object, blkno, size);
+	VM_OBJECT_UNLOCK(object);
+
+	return (valid);
+}
+
 
 /*
  *	zio_buf_insert:		[ internal use only ]
@@ -322,7 +351,6 @@ zio_buf_va_remove(caddr_t va, uint64_t s
 	lock = BUF_HASH_LOCK(idx);
 	bh = &buf_hash_table.ht_table[idx];
 
-
 	CTR3(KTR_SPARE3, "va_remove(va=%p size=%ld) idx=%ld", va, (long)size, idx);
 	mtx_lock(lock);
 	TAILQ_FOREACH(bp, bh, b_freelist)
@@ -525,15 +553,9 @@ zio_buf_vm_object_copy(vm_object_t objec
 	end = OFF_TO_IDX(byte_offset + bp->b_bcount);
 
 	VM_OBJECT_LOCK(object);	
-	for (bp->b_npages = i = 0; start + i < end; i++) {
-		m = vm_page_lookup(object, start + i);
-
-		if ((m == NULL) || (m->valid != VM_PAGE_BITS_ALL))
-			goto done;
+	if (vm_pages_valid_locked(object, bp->b_blkno, bp->b_bcount) == 0)
+		goto done;
 
-		bp->b_pages[i] = m;		
-		bp->b_npages++;
-	}
 	for (i = 0; i < bp->b_npages; i++) {		
 		sf = sf_buf_alloc(bp->b_pages[i], 0);
 		va = (caddr_t)sf_buf_kva(sf);
@@ -685,8 +707,8 @@ zio_buf_evict_overlap(vm_object_t object
 		zio_buf_blkno_remove(tmpbp);
 	}
 done:
-	if (!(collisions == 1 && tmpbp->b_blkno == blkno && tmpbp->b_bcount == size)
-	    && (evict_op == ZB_EVICT_ALL)) {
+	if (!(collisions == 1 && tmpbp->b_blkno == blkno &&
+		tmpbp->b_bcount == size) && (evict_op == ZB_EVICT_ALL)) {
 		start = OFF_TO_IDX(stob(blkno));
 		end = start + OFF_TO_IDX(size);
 		VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
@@ -702,37 +724,6 @@ done:
 }
 
 /*
- * scan blkno + size range in object to verify that all the pages are
- * resident and valid
- */
-static int
-vm_pages_valid_locked(vm_object_t object, uint64_t blkno, uint64_t size)
-{
-	vm_pindex_t start;
-	vm_page_t m;
-	int i;
-
-	start = OFF_TO_IDX(stob(blkno));
-	for (i = 0; i < OFF_TO_IDX(size); i++)
-		if ((m = vm_page_lookup(object, start + i)) == NULL ||
-		    (m->valid != VM_PAGE_BITS_ALL))
-			return (0);
-	return (1);
-}
-
-static int
-vm_pages_valid(vm_object_t object, uint64_t blkno, uint64_t size)
-{
-	int valid;
-
-	VM_OBJECT_LOCK(object);
-	valid = vm_pages_valid_locked(object, blkno, size);
-	VM_OBJECT_UNLOCK(object);
-
-	return (valid);
-}
-
-/*
  * insert pages from object in to bp's b_pages
  * and wire
  */
@@ -894,11 +885,6 @@ _zio_sync_cache(spa_t *spa, blkptr_t *bl
 		if (zio_op == ZIO_TYPE_READ && (bp->b_flags & (B_CACHE|B_INVAL)) == B_CACHE)
 			io_bypass = TRUE;		
 	} else if ((zio_op == ZIO_TYPE_WRITE) || !vm_pages_valid(object, blkno, size)) {
-		/*
-		 * XXX still need to handle the case where the pages in the page cache are valid
-		 * and we are doing a read
-		 */
-
 		VM_OBJECT_LOCK(object);
 		zio_buf_evict_overlap(object, blkno, size, state, NO_TXG,
 		    ZB_EVICT_ALL);


More information about the svn-src-user mailing list