Skip site navigation (1)Skip section navigation (2)
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>