Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 2 Nov 2009 00:26:56 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r198778 - user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Message-ID:  <200911020026.nA20QuGi039653@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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)) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911020026.nA20QuGi039653>