Date: Wed, 18 Nov 2009 00:04:03 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r199460 - in user/kmacy/releng_8_fcs_buf/sys: cddl/contrib/opensolaris/uts/common/fs/zfs sys Message-ID: <200911180004.nAI043NM047414@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kmacy Date: Wed Nov 18 00:04:03 2009 New Revision: 199460 URL: http://svn.freebsd.org/changeset/base/199460 Log: don't rely on b_offset to be unmodified Modified: user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c user/kmacy/releng_8_fcs_buf/sys/sys/buf.h 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 23:03:38 2009 (r199459) +++ user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Wed Nov 18 00:04:03 2009 (r199460) @@ -452,6 +452,7 @@ struct arc_write_callback { arc_buf_t *awcb_buf; }; + struct arc_buf_hdr { /* protected by hash lock */ dva_t b_dva; @@ -1307,11 +1308,14 @@ arc_bgetvp(arc_buf_t *buf) struct bufobj *bo = &vp->v_bufobj; arc_buf_hdr_t *hdr = buf->b_hdr; - if (blkno == 0) + if (zfs_page_cache_disable) + return; + + if (blkno == 0 || hdr->b_birth == 0) return; newbp = buf->b_bp; - newbp->b_offset = hdr->b_birth; + newbp->b_birth = hdr->b_birth; newbp->b_blkno = newbp->b_lblkno = blkno; BO_LOCK(bo); @@ -1325,11 +1329,16 @@ arc_bgetvp(arc_buf_t *buf) /* * buffer is usable for this mapping */ - if (!(hdr->b_flags & ARC_IO_ERROR) && - (bp->b_offset <= hdr->b_birth) && - (bp->b_flags & (B_CACHE|B_INVAL)) == B_CACHE) { + if (((bp->b_flags & (B_CACHE|B_INVAL)) == B_CACHE) && + (bp->b_birth > hdr->b_birth)) { + brelse(bp); + } else if (hdr->b_flags & ARC_IO_ERROR) { bp->b_flags |= B_INVAL; - bp->b_flags &= ~B_CACHE; + bp->b_birth = 0; + brelse(bp); + } else { + bp->b_flags |= B_INVAL; + bp->b_birth = 0; brelse(bp); newbp->b_flags |= B_CACHE; @@ -1338,8 +1347,7 @@ arc_bgetvp(arc_buf_t *buf) BO_LOCK(bo); bgetvp(vp, newbp); BO_UNLOCK(bo); - } else - brelse(bp); + } } else { newbp->b_flags |= B_CACHE; newbp->b_flags &= ~B_INVAL; Modified: user/kmacy/releng_8_fcs_buf/sys/sys/buf.h ============================================================================== --- user/kmacy/releng_8_fcs_buf/sys/sys/buf.h Tue Nov 17 23:03:38 2009 (r199459) +++ user/kmacy/releng_8_fcs_buf/sys/sys/buf.h Wed Nov 18 00:04:03 2009 (r199460) @@ -104,7 +104,8 @@ struct buf { long b_resid; void (*b_iodone)(struct buf *); daddr_t b_blkno; /* Underlying physical block number. */ - off_t b_offset; /* Offset into file. */ + off_t b_offset; /* Offset into file. */ + uint64_t b_birth; /* birth txg */ TAILQ_ENTRY(buf) b_bobufs; /* (V) Buffer's associated vnode. */ struct buf *b_left; /* (V) splay tree link */ struct buf *b_right; /* (V) splay tree link */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911180004.nAI043NM047414>