svn commit: r199618 - user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs

Kip Macy kmacy at FreeBSD.org
Fri Nov 20 23:14:09 UTC 2009


Author: kmacy
Date: Fri Nov 20 23:14:08 2009
New Revision: 199618
URL: http://svn.freebsd.org/changeset/base/199618

Log:
  - call in to zio pipeline even in the case of a page cache hit, but
    bypass the I/O stages

Modified:
  user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c

Modified: user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
==============================================================================
--- user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c	Fri Nov 20 22:22:53 2009	(r199617)
+++ user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c	Fri Nov 20 23:14:08 2009	(r199618)
@@ -1303,17 +1303,21 @@ arc_buf_add_ref(arc_buf_t *buf, void* ta
 void
 arc_binval(spa_t *spa, dva_t *dva)
 {
-	uint64_t blkno = dva->dva_word[1] & ~(1UL<<63);
-	struct vnode *vp = spa_get_vnode(spa);
-	struct bufobj *bo = &vp->v_bufobj;
+	uint64_t blkno;
+	struct vnode *vp;
+	struct bufobj *bo;
 	struct buf *bp;
 
 	if (zfs_page_cache_disable)
 		return;
 
-	if (blkno == 0)
+	if (dva == NULL || spa == NULL || blkno == 0)
 		return;
 
+	blkno = dva->dva_word[1] & ~(1UL<<63);
+	vp = spa_get_vnode(spa);
+	bo = &vp->v_bufobj;
+
 	BO_LOCK(bo);
 	bp = gbincore(bo, blkno);
 	if (bp != NULL) {
@@ -1408,7 +1412,7 @@ arc_getblk(arc_buf_t *buf)
 	bo = &vp->v_bufobj;
 	newbp = NULL;
 
-	if ((size < PAGE_SIZE)) {
+	if (size < PAGE_SIZE) {
 		data = zio_buf_alloc(size);
 	} else if ((buf->b_hdr->b_flags & ARC_BUF_CLONING) ||
 	    BUF_EMPTY(buf->b_hdr)) {
@@ -2961,21 +2965,6 @@ top:
 			ASSERT(hdr->b_datacnt == 0);
 			hdr->b_datacnt = 1;
 		}
-		/*
-		 * We hit in the page cache
-		 *
-		 */
-		if (buf->b_bp != NULL) {
-			if ((buf->b_bp->b_flags & (B_CACHE|B_INVAL)) == B_CACHE) {
-				/*
-				 * track the number of times
-				 * the buffer was found in the cache
-				 */
-				ARCSTAT_BUMP(arcstat_page_cache_hits);
-				mutex_exit(hash_lock);
-				goto top;
-			}
-		}
 
 		acb = kmem_zalloc(sizeof (arc_callback_t), KM_SLEEP);
 		acb->acb_done = done;
@@ -3077,6 +3066,20 @@ top:
 		rzio = zio_read(pio, spa, bp, buf->b_data, size,
 		    arc_read_done, buf, priority, zio_flags, zb);
 
+		/*
+		 * We hit in the page cache
+		 *
+		 */
+		if ((buf->b_bp != NULL) &&
+		    ((buf->b_bp->b_flags & (B_CACHE|B_INVAL)) == B_CACHE)) {
+			/*
+			 * track the number of times
+			 * the buffer was found in the cache
+			 */
+			ARCSTAT_BUMP(arcstat_page_cache_hits);
+			rzio->io_pipeline = ZIO_INTERLOCK_STAGES;
+		}
+
 		if (*arc_flags & ARC_WAIT)
 			return (zio_wait(rzio));
 


More information about the svn-src-user mailing list