--- linux-2.2.10/drivers/block/rd.c~ Tue Jul 13 16:05:37 1999 +++ linux-2.2.10/drivers/block/rd.c Tue Jul 13 16:45:45 1999 @@ -73,15 +73,6 @@ #define MAJOR_NR RAMDISK_MAJOR #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); @@ -149,8 +149,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); @@ -196,7 +196,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 BLKSSZGET: /* Block size of media */ if (!arg) return -EINVAL; @@ -301,6 +301,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; @@ -310,18 +318,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; } @@ -331,7 +340,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) { @@ -516,9 +527,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/%d blocks)\n", - nblocks, rd_length[unit] >> RDBLK_SIZE_BITS); + nblocks, rd_length[unit] >> BLOCK_SIZE_BITS); goto done; }