diff -uNr linux/drivers/block/rd.c linux-2.4.4/drivers/block/rd.c --- linux/drivers/block/rd.c Fri Feb 9 13:30:22 2001 +++ linux-2.4.4/drivers/block/rd.c Mon May 7 14:04:15 2001 @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -469,10 +470,11 @@ int __init identify_ramdisk_image(kdev_t device, struct file *fp, int start_block) { - const int size = 512; + const int size = 1024; struct minix_super_block *minixsb; struct ext2_super_block *ext2sb; struct romfs_super_block *romfsb; + struct cramfs_super *cramfsb, *cramfsb2; int nblocks = -1; unsigned char *buf; @@ -483,6 +485,8 @@ minixsb = (struct minix_super_block *) buf; ext2sb = (struct ext2_super_block *) buf; romfsb = (struct romfs_super_block *) buf; + cramfsb = (struct cramfs_super *) buf; + cramfsb2 = (struct cramfs_super *) (&buf[512]); memset(buf, 0xe5, size); /* @@ -515,6 +519,41 @@ goto done; } + /* cramfs also at block zero */ + /* (superblock can also live at 512-byte offset in block zero) */ + if ((cramfsb->magic == CRAMFS_MAGIC && + memcmp(cramfsb->signature, CRAMFS_SIGNATURE, + sizeof(cramfsb->signature)) == 0) || + ((cramfsb = cramfsb2) && cramfsb2->magic == CRAMFS_MAGIC && + memcmp(cramfsb2->signature, CRAMFS_SIGNATURE, + sizeof(cramfsb2->signature)) == 0)) { + + printk(KERN_NOTICE + "RAMDISK: cramfs filesystem found at block %d\n", + start_block); + + /* cramfs probably has a different blocksize--adjust the + ramdisk's block size to accomodate */ + /* FIXME: should have a way to determine the cramfs + blocksize (if it's going to be variable.....) */ + if (rd_blocksize != PAGE_CACHE_SIZE) { + int i; + + rd_blocksize = PAGE_CACHE_SIZE; + for (i = 0; i < NUM_RAMDISKS; i++) { + rd_hardsec[i] = rd_blocksize; + rd_blocksizes[i] = rd_blocksize; + } + printk(KERN_NOTICE + "RAMDISK: overriding ramdisk block size to %d for cramfs filesystem\n", + rd_blocksize); + } + /* Note: even if ramdisk blocksize is changed, nblocks is still + calculated using 1k blocksize for the INITRD device */ + nblocks = (cramfsb->size+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS; + goto done; + } + /* * Read block 1 to test for minix and ext2 superblock */