diff -urNp ref/fs/block_dev.c 2.4.20pre5aa1/fs/block_dev.c --- ref/fs/block_dev.c Fri Aug 9 14:52:20 2002 +++ 2.4.20pre5aa1/fs/block_dev.c Fri Aug 30 06:48:26 2002 @@ -19,6 +19,9 @@ #include #include #include +#ifdef CONFIG_BLK_DEV_INITRD +#include +#endif #include @@ -570,7 +573,25 @@ static int do_open(struct block_device * if (bdev->bd_op->open) ret = bdev->bd_op->open(inode, file); if (!ret) { - bdev->bd_openers++; + /* + * INITRD is special, since its ->open succeeds + * but it has no MINOR slot for the softblocksize + * (despite the MAJOR slot is initialized), + * so we cannot run set_blocksize() on the initrd + * or we'd corrupt memory randomly. Hackish check + * but optimal (so no need of 251 entries + * in the ramdisk blocksize array). + */ + if (!bdev->bd_openers++ +#ifdef CONFIG_BLK_DEV_INITRD + && dev != mk_kdev(RAMDISK_MAJOR, INITRD_MINOR) +#endif + ) { + int blksize = BLOCK_SIZE; + if (file->f_flags & O_DIRECT) + blksize = get_hardsect_size(dev); + set_blocksize(dev, blksize); + } bdev->bd_inode->i_size = blkdev_size(dev); bdev->bd_inode->i_blkbits = blksize_bits(block_size(dev)); } else {