From owner-freebsd-current Thu May 29 14:18:35 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.5/8.8.5) id OAA09946 for current-outgoing; Thu, 29 May 1997 14:18:35 -0700 (PDT) Received: from godzilla.zeta.org.au (godzilla.zeta.org.au [203.2.228.19]) by hub.freebsd.org (8.8.5/8.8.5) with ESMTP id OAA09941 for ; Thu, 29 May 1997 14:18:30 -0700 (PDT) Received: (from bde@localhost) by godzilla.zeta.org.au (8.8.5/8.6.9) id HAA29423; Fri, 30 May 1997 07:16:00 +1000 Date: Fri, 30 May 1997 07:16:00 +1000 From: Bruce Evans Message-Id: <199705292116.HAA29423@godzilla.zeta.org.au> To: bde@zeta.org.au, dfr@nlsystems.com Subject: Re: disk cache challenged by small block sizes Cc: current@freebsd.org Sender: owner-current@freebsd.org X-Loop: FreeBSD.org Precedence: bulk >This is caused by my recent changes to vfs_bio to make NFS mmap work >properly. I didn't test on a filesystem with small block sizes. This >patch should fix it: Thanks. >... > static void >-vfs_page_set_valid(struct buf *bp, vm_offset_t off, vm_page_t m) >+vfs_page_set_valid(struct buf *bp, vm_ooffset_t off, int pageno, vm_page_t m) > { > struct vnode *vp = bp->b_vp; > vm_offset_t soff, eoff; > > soff = off; >- eoff = min(off + PAGE_SIZE, bp->b_bufsize); >+ eoff = off + min(PAGE_SIZE, bp->b_bufsize); >+ vm_page_set_invalid(m, soff, eoff); This sometimes traps. It only works on my test system. I think soff needs to be reduced (mod PAGE_SIZE)? > if (vp->v_tag == VT_NFS) { >- soff = max((bp->b_validoff + DEV_BSIZE - 1) & -DEV_BSIZE, soff); >- eoff = min(bp->b_validend & -DEV_BSIZE, eoff); >+ vm_offset_t sv, ev; >+ sv = off + (bp->b_validoff + DEV_BSIZE - 1) & -DEV_BSIZE >+ - pageno * PAGE_SIZE; >+ ev = off + bp->b_validend & -DEV_BSIZE - pageno * PAGE_SIZE; This has too few parentheses even for me :-). Please use `& ~(BSIZE - 1)' instead of -DEV_BSIZE. The latter assumes 2's complement and may be less idiomatic. Bruce