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>
index | next in thread | raw e-mail
>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
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199705292116.HAA29423>
