Date: Tue, 17 Nov 2009 06:47:28 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r199347 - user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs Message-ID: <200911170647.nAH6lSGJ094126@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911170647.nAH6lSGJ094126>