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