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

Kip Macy kmacy at FreeBSD.org
Tue Nov 17 06:47:29 UTC 2009


Author: kmacy
Date: Tue Nov 17 06:47:28 2009
New Revision: 199347
URL: http://svn.freebsd.org/changeset/base/199347

Log:
  - skip arc_bgetvp if blkno is 0
  - set blkno and birth for newbp before brelse

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	Tue Nov 17 06:32:56 2009	(r199346)
+++ user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c	Tue Nov 17 06:47:28 2009	(r199347)
@@ -1302,15 +1302,21 @@ static void
 arc_bgetvp(arc_buf_t *buf)
 {	
 	uint64_t blkno = buf->b_hdr->b_dva.dva_word[1] & ~(1UL<<63);
-	struct buf *bp = buf->b_bp;
+	struct buf *newbp, *bp = buf->b_bp;
 	struct vnode *vp = spa_get_vnode(buf->b_hdr->b_spa);
 	struct bufobj *bo = &vp->v_bufobj;
 	arc_buf_hdr_t *hdr = buf->b_hdr;
 
+	if (blkno == 0)
+		return;
+
+	newbp = buf->b_bp;
+	newbp->b_offset = hdr->b_birth;
+	newbp->b_blkno = newbp->b_lblkno = blkno;
+
 	BO_LOCK(bo);
 	bp = gbincore(bo, blkno);
 	if (bp != NULL) {
-
 		/*
 		 * XXX we have a race with getblk here
 		 */
@@ -1324,26 +1330,22 @@ arc_bgetvp(arc_buf_t *buf)
 		    (bp->b_flags & (B_CACHE|B_INVAL)) == B_CACHE) { 
 			bp->b_flags |= B_INVAL;
 			bp->b_flags &= ~B_CACHE;
-
 			brelse(bp);
-			buf->b_bp->b_offset = hdr->b_birth;
-			buf->b_bp->b_flags |= B_CACHE;
-			buf->b_bp->b_flags &= ~B_INVAL;
-
+			
+			newbp->b_flags |= B_CACHE;
+			newbp->b_flags &= ~B_INVAL;
+			
 			BO_LOCK(bo);
-			bgetvp(vp, buf->b_bp);
+			bgetvp(vp, newbp);
 			BO_UNLOCK(bo);
 		} else
 			brelse(bp);
 	} else {
-		if (blkno != 0) {
-			buf->b_bp->b_flags |= B_CACHE;
-			buf->b_bp->b_flags &= ~B_INVAL;
-			bgetvp(vp, buf->b_bp);
-		}
+		newbp->b_flags |= B_CACHE;
+		newbp->b_flags &= ~B_INVAL;
+		bgetvp(vp, newbp);
 		BO_UNLOCK(bo);
 	}
-	
 }
 
 static void


More information about the svn-src-user mailing list