Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 May 1997 07:16:00 +1000
From:      Bruce Evans <bde@zeta.org.au>
To:        bde@zeta.org.au, dfr@nlsystems.com
Cc:        current@freebsd.org
Subject:   Re: disk cache challenged by small block sizes
Message-ID:  <199705292116.HAA29423@godzilla.zeta.org.au>

next in thread | raw e-mail | index | archive | help
>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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199705292116.HAA29423>