Re: 2.6.0test9 Reiserfs boot time "buffer layer error at fs/buffer.c:431"

Oleg Drokin
2003-11-02T09:24:50Z

Hello!

On Sat, Nov 01, 2003 at 11:33:54PM -0800, Andrew Morton wrote:
> > >> (These buffers are there because reiserfs first reads that offset (in bytes)
> > >> with whatever current blocksize is, except they should have been invalidated of
> > >> course).
> > >> Even if invalidate_bdev() -> invalidate_inode_pages() have not cleaned
> > >> everything, truncate_inode_pages() should have done this.
> > > yup.
> > The person who had the problem is actually using the Debian tree which
> > carried over a patch from 2.4 that removed the truncate_inode_pages
> > call in set_blocksize. So I appologise for the noise.

Sigh.

> truncate_inode_pages() will unconditionally remove the pages from
> pagecache: they're gone. So if some poorly behaved piece of code
> (reiserfs's read_super_block()) holds a reference against a buffer, that
> piece of code ends up owning the page - the VFS has lost interest in it.

Here's the patch against reiserfs in 2.6 (2.4 does not need it as this bit
of code is different and correct there).

===== fs/reiserfs/super.c 1.69 vs edited =====
--- 1.69/fs/reiserfs/super.c Tue Sep 23 07:16:25 2003
+++ edited/fs/reiserfs/super.c Sun Nov 2 11:11:36 2003
@@ -942,6 +942,7 @@
{
struct buffer_head * bh;
struct reiserfs_super_block * rs;
+ int fs_blocksize;

bh = sb_bread (s, offset / s->s_blocksize);
@@ -961,8 +962,9 @@
//
// ok, reiserfs signature (old or new) found in at the given offset
//
- sb_set_blocksize (s, sb_blocksize(rs));
+ fs_blocksize = sb_blocksize(rs);
brelse (bh);
+ sb_set_blocksize (s, fs_blocksize);

bh = sb_bread (s, offset / s->s_blocksize);
if (!bh) {

Bye,
Oleg