Date: Sat, 21 Jun 2003 14:58:10 +1000 (EST) From: Bruce Evans <bde@zeta.org.au> To: "Tim J. Robbins" <tjr@FreeBSD.org> Cc: cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sys/fs/ntfs ntfs_subr.c Message-ID: <20030621135027.G51140@gamplex.bde.org> In-Reply-To: <200306201452.h5KEqqh3054891@repoman.freebsd.org> References: <200306201452.h5KEqqh3054891@repoman.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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. msdosfs used to have problems related to this. For msdosfs, data blocks (clusters) have different sizes than some metadata blocks (BPB, FATs and root directory) and are not aligned to cluster_size boundaries, so it is easy for metadata buffers to overlap data buffers. IIRC, the fix involved making vfs_bio more aware of overlapping (or just partially valid?) buffers. msdosfs still does careless things like bread() with a size of 2048 to read the boot "sector" and not invalidating the buffer for this before reading other blocks. Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030621135027.G51140>