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

Kip Macy kmacy at FreeBSD.org
Tue Dec 22 22:38:54 UTC 2009


Author: kmacy
Date: Tue Dec 22 22:38:54 2009
New Revision: 200882
URL: http://svn.freebsd.org/changeset/base/200882

Log:
  - remove _locked and !_locked function names where only the _locked variant is ever used
  - implement vm_pages_valid(_locked)
  - implement vm_object_reference_pages

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	Tue Dec 22 22:15:52 2009	(r200881)
+++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c	Tue Dec 22 22:38:54 2009	(r200882)
@@ -568,16 +568,18 @@ zio_buf_vm_object_evict(buf_t bp)
 }
 
 static void
-zio_buf_vm_object_insert_locked(buf_t bp, struct vnode *vp,
+zio_buf_vm_object_insert(buf_t bp, struct vnode *vp,
     vm_object_t object, int valid)
 {
 	vm_page_t m;
-	vm_pindex_t start = OFF_TO_IDX(stob(bp->b_blkno));
+	vm_pindex_t start;
 	int i;
 
+	VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
 	/*
 	 * Insert buffer pages in the object
 	 */
+	start = OFF_TO_IDX(stob(bp->b_blkno));
 	for (i = 0; i < bp->b_npages; i++) {
 		m = bp->b_pages[i];
 		if (valid)
@@ -593,18 +595,6 @@ zio_buf_vm_object_insert_locked(buf_t bp
 	vm_page_unlock_queues();
 }
 
-static void
-zio_buf_vm_object_insert(buf_t bp, int valid)
-{
-	spa_t *spa = zio_buf_get_spa(bp);
-	struct vnode *vp = spa_get_vnode(spa);
-	vm_object_t object = vp->v_object;
-
-	VM_OBJECT_LOCK(object);
-	zio_buf_vm_object_insert_locked(bp, vp, object, valid);
-	VM_OBJECT_UNLOCK(object);
-}
-
 /*
  *	zio_buf_evict_overlap:		[ internal use only ]
  *
@@ -617,8 +607,8 @@ zio_buf_vm_object_insert(buf_t bp, int v
  *	This routine may not block.
  */
 static void
-zio_buf_evict_overlap_locked(daddr_t blkno, int size, zio_spa_state_t state,
-    uint64_t txg, int evict_op, vm_object_t object)
+zio_buf_evict_overlap(vm_object_t object, daddr_t blkno, int size,
+    zio_spa_state_t state, uint64_t txg, int evict_op)
 {
 	buf_t root, tmpbp;
 	daddr_t blkno_end, tmpblkno, tmpblkno_end;
@@ -672,6 +662,7 @@ done:
 	    && (evict_op == ZB_EVICT_ALL)) {
 		start = OFF_TO_IDX(stob(blkno));
 		end = start + OFF_TO_IDX(size);
+		VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
 		vm_page_cache_free(object, start, end);
 		vm_object_page_remove(object, start, end, FALSE);
 #ifdef INVARIANTS
@@ -683,18 +674,6 @@ done:
 	}
 }
 
-static void
-zio_buf_evict_overlap(daddr_t blkno, int size, zio_spa_state_t state,
-    uint64_t txg, int evict_op)
-{
-	vm_object_t	object = spa_get_vm_object(state->zss_spa);
-
-	VM_OBJECT_LOCK(object);
-	zio_buf_evict_overlap_locked(blkno, size, state, txg, evict_op, object);
-	VM_OBJECT_UNLOCK(object);
-}
-
-
 /*
  * scan blkno + size range in object to verify that all the pages are
  * resident and valid
@@ -702,8 +681,16 @@ zio_buf_evict_overlap(daddr_t blkno, int
 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;
 
-	return (0);
+	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
@@ -725,7 +712,19 @@ vm_pages_valid(vm_object_t object, uint6
 static void
 vm_object_reference_pages(vm_object_t object, buf_t bp)
 {
-	
+	uint64_t blkno, size;
+	vm_pindex_t start;
+	vm_page_t m;
+	int i;
+
+	start = OFF_TO_IDX(stob(blkno));
+	vm_page_lock_queues();
+	for (i = 0; i < bp->b_npages; i++) {
+		m = vm_page_lookup(object, start + i);
+		vm_page_wire(m);
+		bp->b_pages[i] = m;
+	}
+	vm_page_unlock_queues();
 }
 
 /*
@@ -848,7 +847,7 @@ _zio_sync_cache(spa_t *spa, blkptr_t *bl
 	    ("doing I/O with cloned or evicted buffer 0x%x", bp->b_flags));
 
 	if (bp->b_flags & B_MALLOC) {
-		zio_buf_evict_overlap(blkno, size, state, txg, ZB_EVICT_BUFFERED);
+		zio_buf_evict_overlap(object, blkno, size, state, txg, ZB_EVICT_BUFFERED);
 
 		if (zio_op == ZIO_TYPE_READ) {
 			/*
@@ -875,18 +874,18 @@ _zio_sync_cache(spa_t *spa, blkptr_t *bl
 		 */
 
 		VM_OBJECT_LOCK(object);
-		zio_buf_evict_overlap_locked(blkno, size, state, NO_TXG,
-		    ZB_EVICT_ALL, object);
+		zio_buf_evict_overlap(object, blkno, size, state, NO_TXG,
+		    ZB_EVICT_ALL);
 		bp->b_blkno = bp->b_lblkno = blkno;
 		bp->b_flags |= (B_VMIO|B_ASSIGNED);
 		bp->b_birth = txg;
 		zio_buf_blkno_insert(bp, state);
-		zio_buf_vm_object_insert_locked(bp, vp, object, zio_op == ZIO_TYPE_WRITE);
+		zio_buf_vm_object_insert(bp, vp, object, zio_op == ZIO_TYPE_WRITE);
 		VM_OBJECT_UNLOCK(object);
 	} else {
 		KASSERT(zio_op == ZIO_TYPE_READ, ("unexpected op %d", zio_op));
-		zio_buf_evict_overlap_locked(blkno, size, state, NO_TXG,
-		    ZB_EVICT_BUFFERED, object);
+		zio_buf_evict_overlap(object, blkno, size, state, NO_TXG,
+		    ZB_EVICT_BUFFERED);
 		bp->b_blkno = bp->b_lblkno = blkno;
 		bp->b_flags |= (B_VMIO|B_ASSIGNED);
 		bp->b_birth = txg;
@@ -897,7 +896,7 @@ _zio_sync_cache(spa_t *spa, blkptr_t *bl
 				vm_page_free(bp->b_pages[i]);
 			vm_object_reference_pages(object, bp);
 		} else
-			zio_buf_vm_object_insert_locked(bp, vp, object, FALSE);
+			zio_buf_vm_object_insert(bp, vp, object, FALSE);
 		VM_OBJECT_UNLOCK(object);
 	}
 


More information about the svn-src-user mailing list