Re: cvs commit: src/sys/fs/ntfs ntfs_subr.c

From: Tim J. Robbins <>
Date: Sat, 21 Jun 2003 19:35:10 +1000
On Sat, Jun 21, 2003 at 02:58:10PM +1000, Bruce Evans wrote:

> On Fri, 20 Jun 2003, Tim J. Robbins wrote:
> > tjr         2003/06/20 07:52:52 PDT
> >
> >   FreeBSD src repository
> >
> >   Modified files:
> >     sys/fs/ntfs          ntfs_subr.c
> >   Log:
> >   Merge from NetBSD src/sys/ntfs/ntfs_subr.c 1.5 & 1.30 (jdolecek):
> >   - Avoid calling bread() with different sizes on the same blkno.
> >     Although the buffer cache is designed to handle differing size
> >     buffers, it erroneously tries to write the incorrectly-sized buffer
> >     buffer back to disk before reading the correctly-sized one, even
> >     when it's not dirty. This behaviour caused a panic for read-only
> >     NTFS mounts when INVARIANTS was enabled ("bundirty: buffer x still
> >     on queue y"), reported by NAKAJI Hiroyuki.
> Maybe the buffer cache is designed to handle differing size buffers in
> NetBSD, but in FreeBSD I believe it is fundamentally incompatible with
> differing size buffers except when the buffers don't overlap.  The special
> case of overlap where the buffers have the same blkno could be handled
> relatively easily, but apparently isn't.  The general case would involve
> searching for all overlapping buffers and updating their states coherently
> whenever a buffer is changed.

NetBSD's buffer cache definitely cannot handle requests for the same blkno
with different sizes. jdolecek added that code to avoid requesting different
sized buffers because NetBSD panics when it detects such a request; FreeBSD
tries to handle the request correctly, but does a pretty bad job of it and
issues the bogus write requests I mentioned in the commit message.

I'm still trying to figure why it tries to write non-B_DELWRI buffers back to
disk. It was added in revision 1.158, but the commit message is not very
helpful in understanding exactly what kind of problems it was trying to fix.

Received on Sat Jun 21 2003 - 02:35:26 UTC