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

Kip Macy kmacy at FreeBSD.org
Mon Nov 2 00:26:57 UTC 2009


Author: kmacy
Date: Mon Nov  2 00:26:56 2009
New Revision: 198778
URL: http://svn.freebsd.org/changeset/base/198778

Log:
  - ensure that we find the right buffer to call brelvp on

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	Sun Nov  1 23:59:23 2009	(r198777)
+++ user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c	Mon Nov  2 00:26:56 2009	(r198778)
@@ -1312,12 +1312,22 @@ arc_getblk(arc_buf_t *buf)
 	if (buf->b_hdr->b_flags & ARC_BUF_CLONING) {
 		newbp = geteblk(size, flags);
 		tbuf = buf;
-
-		while (tbuf->b_next != NULL)
-			tbuf = tbuf->b_next;		
-		bp = tbuf->b_bp;
 		vp = spa_get_vnode(spa);
 
+		bcopy(buf->b_bp->b_data, newbp->b_data, size);
+		while (tbuf->b_next != NULL) {
+			if (tbuf->b_bp->b_vp != NULL) {
+				KASSERT((bp->b_xflags & (BX_VNCLEAN|BX_VNDIRTY)) == BX_VNCLEAN, ("brelvp() on buffer that is not in splay"));
+
+				bp = tbuf->b_bp;
+				bp->b_flags |= B_INVAL;
+				bp->b_flags &= ~B_CACHE;
+				brelvp(bp);
+				break;
+			}
+			tbuf = tbuf->b_next;
+		}
+
 		KASSERT((bp->b_blkno == bp->b_lblkno) &&
 		    (bp->b_blkno == blkno),
 		    ("blkno mismatch b_blkno %ld b_lblkno %ld blkno %ld",
@@ -1327,18 +1337,11 @@ arc_getblk(arc_buf_t *buf)
 		newbp->b_blkno = blkno;
 		newbp->b_offset = (blkno<<9);	
 
-		if (bp->b_vp != NULL) {			
-			KASSERT((bp->b_xflags & (BX_VNCLEAN|BX_VNDIRTY)) == BX_VNCLEAN, ("brelvp() on buffer that is not in splay"));
-			brelvp(bp);
-		}
 		BO_LOCK(&vp->v_bufobj);
 		bgetvp(vp, newbp);
 		BO_UNLOCK(&vp->v_bufobj);
 		newbp->b_flags &= ~B_INVAL;
 		newbp->b_flags |= B_CACHE;
-		bp->b_flags |= B_INVAL;
-		bp->b_flags &= ~B_CACHE;
-		bcopy(bp->b_data, newbp->b_data, size);
 		buf->b_hdr->b_flags &= ~ARC_BUF_CLONING;
 		
 	} else if (BUF_EMPTY(buf->b_hdr)) {


More information about the svn-src-user mailing list