diff -urN 2.3.14-pre2/drivers/block/rd.c 2.3.14-pre2-1/drivers/block/rd.c --- 2.3.14-pre2/drivers/block/rd.c Thu Aug 12 02:53:19 1999 +++ 2.3.14-pre2-1/drivers/block/rd.c Fri Aug 20 16:52:56 1999 @@ -74,15 +74,6 @@ #include #include -/* - * We use a block size of 512 bytes in comparision to BLOCK_SIZE - * defined in include/linux/blk.h. This because of the finer - * granularity for filling up a RAM disk. - */ -#define RDBLK_SIZE_BITS 9 -#define RDBLK_SIZE (1<rq_dev); @@ -196,8 +196,8 @@ goto repeat; } - offset = CURRENT->sector << RDBLK_SIZE_BITS; - len = CURRENT->current_nr_sectors << RDBLK_SIZE_BITS; + offset = CURRENT->sector << 9; + len = CURRENT->current_nr_sectors << 9; if ((offset + len) > rd_length[minor]) { end_request(0); @@ -243,7 +243,7 @@ case BLKGETSIZE: /* Return device size */ if (!arg) return -EINVAL; - return put_user(rd_length[minor] >> RDBLK_SIZE_BITS, (long *) arg); + return put_user(rd_kbsize[minor] << 1, (long *) arg); case BLKROSET: case BLKROGET: @@ -347,6 +347,14 @@ { int i; + if (rd_blocksize > PAGE_SIZE || rd_blocksize < 512 || + (rd_blocksize & (rd_blocksize-1))) + { + printk("RAMDISK: wrong blocksize %d, reverting to defaults\n", + rd_blocksize); + rd_blocksize = BLOCK_SIZE; + } + if (register_blkdev(MAJOR_NR, "ramdisk", &fd_fops)) { printk("RAMDISK: Could not get major %d", MAJOR_NR); return -EIO; @@ -356,18 +364,19 @@ for (i = 0; i < NUM_RAMDISKS; i++) { /* rd_size is given in kB */ - rd_length[i] = (rd_size << BLOCK_SIZE_BITS); - rd_hardsec[i] = RDBLK_SIZE; - rd_blocksizes[i] = BLOCK_SIZE; - rd_kbsize[i] = (rd_length[i] >> BLOCK_SIZE_BITS); + rd_length[i] = rd_size << 10; + rd_hardsec[i] = rd_blocksize; + rd_blocksizes[i] = rd_blocksize; + rd_kbsize[i] = rd_size; } hardsect_size[MAJOR_NR] = rd_hardsec; /* Size of the RAM disk blocks */ blksize_size[MAJOR_NR] = rd_blocksizes; /* Avoid set_blocksize() check */ blk_size[MAJOR_NR] = rd_kbsize; /* Size of the RAM disk in kB */ - printk("RAM disk driver initialized: %d RAM disks of %dK size\n", - NUM_RAMDISKS, rd_size); + printk("RAMDISK driver initialized: " + "%d RAM disks of %dK size %d blocksize\n", + NUM_RAMDISKS, rd_size, rd_blocksize); return 0; } @@ -377,7 +386,9 @@ #ifdef MODULE MODULE_PARM (rd_size, "1i"); -MODULE_PARM_DESC(rd_size, "Size of each RAM disk."); +MODULE_PARM_DESC(rd_size, "Size of each RAM disk in kbytes."); +MODULE_PARM (rd_blocksize, "i"); +MODULE_PARM_DESC(rd_blocksize, "Blocksize of each RAM disk in bytes."); int init_module(void) { @@ -564,9 +575,15 @@ goto done; } - if (nblocks > (rd_length[unit] >> RDBLK_SIZE_BITS)) { + /* + * NOTE NOTE: nblocks suppose that the blocksize is BLOCK_SIZE, so + * rd_load_image will work only with filesystem BLOCK_SIZE wide! + * So make sure to use 1k blocksize while generating ext2fs + * ramdisk-images. + */ + if (nblocks > (rd_length[unit] >> BLOCK_SIZE_BITS)) { printk("RAMDISK: image too big! (%d/%ld blocks)\n", - nblocks, rd_length[unit] >> RDBLK_SIZE_BITS); + nblocks, rd_length[unit] >> BLOCK_SIZE_BITS); goto done; }