Date: Sun, 8 Nov 2009 00:11:16 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r199033 - user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs Message-ID: <200911080011.nA80BGpw067751@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kmacy Date: Sun Nov 8 00:11:16 2009 New Revision: 199033 URL: http://svn.freebsd.org/changeset/base/199033 Log: - ensure that bcopy always happens when cloning - bypass buf infrastructure for blocks less than PAGE_SIZE 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 Sat Nov 7 23:37:29 2009 (r199032) +++ user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Sun Nov 8 00:11:16 2009 (r199033) @@ -1305,6 +1305,7 @@ arc_getblk(arc_buf_t *buf) arc_buf_contents_t type = buf->b_hdr->b_type; spa_t *spa = buf->b_hdr->b_spa; off_t blkno = buf->b_hdr->b_dva.dva_word[1] & ~(1UL<<63); + void *data; struct buf *newbp, *bp; arc_buf_t *tbuf; struct vnode *vp; @@ -1323,11 +1324,12 @@ arc_getblk(arc_buf_t *buf) bo = &vp->v_bufobj; newbp = NULL; - if ((size < PAGE_SIZE) || - (buf->b_hdr->b_flags & ARC_BUF_CLONING) || - BUF_EMPTY(buf->b_hdr)) { - + if ((size < PAGE_SIZE)) { + data = zio_buf_alloc(size); + } else if ((buf->b_hdr->b_flags & ARC_BUF_CLONING) || + BUF_EMPTY(buf->b_hdr)) { newbp = geteblk(size, flags); + data = newbp->b_data; } else { /* * We need to be careful to handle the case where the buffer @@ -1358,13 +1360,15 @@ arc_getblk(arc_buf_t *buf) newbp = getblk(vp, blkno, size, 0, 0, flags); newbp->b_offset = buf->b_hdr->b_birth; + data = newbp->b_data; } - if ((size >= PAGE_SIZE) && (buf->b_hdr->b_flags & ARC_BUF_CLONING)) { + if (buf->b_hdr->b_flags & ARC_BUF_CLONING) { vp = spa_get_vnode(spa); bcopy(buf->b_next->b_data, newbp->b_data, size); - arc_binval(buf, blkno, vp, size, newbp); + if (size >= PAGE_SIZE) + arc_binval(buf, blkno, vp, size, newbp); buf->b_hdr->b_flags &= ~ARC_BUF_CLONING; } @@ -1379,7 +1383,7 @@ arc_getblk(arc_buf_t *buf) BUF_KERNPROC(newbp); buf->b_bp = newbp; - buf->b_data = newbp->b_data; + buf->b_data = data; } static void @@ -1388,6 +1392,11 @@ arc_brelse(arc_buf_t *buf, void *data, s struct buf *bp; bp = buf->b_bp; + if (bp == NULL) { + zio_buf_free(buf->b_data, size); + return; + } + #ifdef INVARIANTS if (bp->b_vp) { KASSERT((buf->b_bp->b_xflags & (BX_VNCLEAN|BX_VNDIRTY)) == BX_VNCLEAN, ("brelse() on buffer that is not clean")); @@ -1717,6 +1726,7 @@ arc_evict(arc_state_t *state, spa_t *spa if (type == ARC_BUFC_METADATA) { offset = 0; + list_count = ARC_BUFC_NUMMETADATALISTS; list_start = &state->arcs_lists[0]; evicted_list_start = &evicted_state->arcs_lists[0];
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911080011.nA80BGpw067751>