From ab941afd5df16ddd5c2b36e839ce55186c11bbd0 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 23 Apr 2003 04:27:26 -0700 Subject: [PATCH] [PATCH] split initrd from ramdisk driver They don't have any code in common, so the initrd support can go into a separate file and not require ramdisk support. Lots of ifdefs gone and smaller kernel images for initrd users. --- drivers/block/Kconfig | 1 - drivers/block/Makefile | 1 + drivers/block/initrd.c | 100 +++++++++++++++++++++++++++++++++++++++++ drivers/block/rd.c | 91 +------------------------------------ 4 files changed, 102 insertions(+), 91 deletions(-) create mode 100644 drivers/block/initrd.c diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig index 52898d856ee11..9cda4584232e6 100644 --- a/drivers/block/Kconfig +++ b/drivers/block/Kconfig @@ -331,7 +331,6 @@ config BLK_DEV_RAM_SIZE config BLK_DEV_INITRD bool "Initial RAM disk (initrd) support" - depends on BLK_DEV_RAM=y help The initial RAM disk is a RAM disk that is loaded by the boot loader (loadlin or lilo) and that is mounted as root before the normal boot diff --git a/drivers/block/Makefile b/drivers/block/Makefile index fec494f74fadc..c723e8ecc5840 100644 --- a/drivers/block/Makefile +++ b/drivers/block/Makefile @@ -20,6 +20,7 @@ obj-$(CONFIG_ATARI_ACSI) += acsi.o obj-$(CONFIG_ATARI_SLM) += acsi_slm.o obj-$(CONFIG_AMIGA_Z2RAM) += z2ram.o obj-$(CONFIG_BLK_DEV_RAM) += rd.o +obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o obj-$(CONFIG_BLK_DEV_LOOP) += loop.o obj-$(CONFIG_BLK_DEV_PS2) += ps2esdi.o obj-$(CONFIG_BLK_DEV_XD) += xd.o diff --git a/drivers/block/initrd.c b/drivers/block/initrd.c new file mode 100644 index 0000000000000..41a7725ea4743 --- /dev/null +++ b/drivers/block/initrd.c @@ -0,0 +1,100 @@ + +#include +#include +#include +#include +#include +#include +#include +#include + + +unsigned long initrd_start, initrd_end; +int initrd_below_start_ok; + +static int initrd_users; +static spinlock_t initrd_users_lock = SPIN_LOCK_UNLOCKED; + +static struct gendisk *initrd_disk; + +static ssize_t initrd_read(struct file *file, char *buf, + size_t count, loff_t *ppos) +{ + int left = initrd_end - initrd_start - *ppos; + + if (count > left) + count = left; + if (count == 0) + return 0; + if (copy_to_user(buf, (char *)initrd_start + *ppos, count)) + return -EFAULT; + + *ppos += count; + return count; +} + +static int initrd_release(struct inode *inode,struct file *file) +{ + + blkdev_put(inode->i_bdev, BDEV_FILE); + + spin_lock(&initrd_users_lock); + if (!--initrd_users) { + spin_unlock(&initrd_users_lock); + del_gendisk(initrd_disk); + free_initrd_mem(initrd_start, initrd_end); + initrd_start = 0; + } else + spin_unlock(&initrd_users_lock); + + return 0; +} + +static struct file_operations initrd_fops = { + .read = initrd_read, + .release = initrd_release, +}; + +static int initrd_open(struct inode *inode, struct file *filp) +{ + if (!initrd_start) + return -ENODEV; + + spin_lock(&initrd_users_lock); + initrd_users++; + spin_unlock(&initrd_users_lock); + + filp->f_op = &initrd_fops; + return 0; +} + +static struct block_device_operations initrd_bdops = { + .owner = THIS_MODULE, + .open = initrd_open, +}; + +static int __init initrd_init(void) +{ + initrd_disk = alloc_disk(1); + if (!initrd_disk) + return -ENOMEM; + + initrd_disk->major = RAMDISK_MAJOR; + initrd_disk->first_minor = INITRD_MINOR; + initrd_disk->fops = &initrd_bdops; + + sprintf(initrd_disk->disk_name, "initrd"); + sprintf(initrd_disk->devfs_name, "rd/initrd"); + + set_capacity(initrd_disk, (initrd_end-initrd_start+511) >> 9); + add_disk(initrd_disk); + return 0; +} + +static void __exit initrd_exit(void) +{ + put_disk(initrd_disk); +} + +module_init(initrd_init); +module_exit(initrd_exit); diff --git a/drivers/block/rd.c b/drivers/block/rd.c index c72d687910e53..3a8c264f2c722 100644 --- a/drivers/block/rd.c +++ b/drivers/block/rd.c @@ -56,20 +56,12 @@ #include #include /* for invalidate_bdev() */ #include -#include #include #include /* The RAM disk size is now a parameter */ #define NUM_RAMDISKS 16 /* This cannot be overridden (yet) */ -#ifdef CONFIG_BLK_DEV_INITRD -static int initrd_users; -static spinlock_t initrd_users_lock = SPIN_LOCK_UNLOCKED; -unsigned long initrd_start, initrd_end; -int initrd_below_start_ok; -#endif - /* Various static variables go here. Most are used only in the RAM disk code. */ @@ -269,53 +261,6 @@ static int rd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un return error; } - -#ifdef CONFIG_BLK_DEV_INITRD - -static struct block_device_operations rd_bd_op; -static struct gendisk *initrd_disk; - -static ssize_t initrd_read(struct file *file, char *buf, - size_t count, loff_t *ppos) -{ - int left; - - left = initrd_end - initrd_start - *ppos; - if (count > left) count = left; - if (count == 0) return 0; - if (copy_to_user(buf, (char *)initrd_start + *ppos, count)) - return -EFAULT; - *ppos += count; - return count; -} - - -static int initrd_release(struct inode *inode,struct file *file) -{ - extern void free_initrd_mem(unsigned long, unsigned long); - - blkdev_put(inode->i_bdev, BDEV_FILE); - - spin_lock(&initrd_users_lock); - if (!--initrd_users) { - spin_unlock(&initrd_users_lock); - del_gendisk(initrd_disk); - free_initrd_mem(initrd_start, initrd_end); - initrd_start = 0; - } else { - spin_unlock(&initrd_users_lock); - } - return 0; -} - - -static struct file_operations initrd_fops = { - .read = initrd_read, - .release = initrd_release, -}; - -#endif - static struct backing_dev_info rd_backing_dev_info = { .ra_pages = 0, /* No readahead */ .memory_backed = 1, /* Does not contribute to dirty memory */ @@ -325,18 +270,6 @@ static int rd_open(struct inode * inode, struct file * filp) { int unit = minor(inode->i_rdev); -#ifdef CONFIG_BLK_DEV_INITRD - if (unit == INITRD_MINOR) { - spin_lock(&initrd_users_lock); - initrd_users++; - spin_unlock(&initrd_users_lock); - if (!initrd_start) - return -ENODEV; - filp->f_op = &initrd_fops; - return 0; - } -#endif - /* * Immunize device against invalidate_buffers() and prune_icache(). */ @@ -375,9 +308,7 @@ static void __exit rd_cleanup (void) del_gendisk(rd_disks[i]); put_disk(rd_disks[i]); } -#ifdef CONFIG_BLK_DEV_INITRD - put_disk(initrd_disk); -#endif + devfs_remove("rd"); unregister_blkdev(RAMDISK_MAJOR, "ramdisk" ); } @@ -396,17 +327,6 @@ static int __init rd_init (void) rd_blocksize = BLOCK_SIZE; } -#ifdef CONFIG_BLK_DEV_INITRD - initrd_disk = alloc_disk(1); - if (!initrd_disk) - return -ENOMEM; - initrd_disk->major = RAMDISK_MAJOR; - initrd_disk->first_minor = INITRD_MINOR; - initrd_disk->fops = &rd_bd_op; - sprintf(initrd_disk->disk_name, "initrd"); - sprintf(initrd_disk->devfs_name, "rd/initrd"); -#endif - for (i = 0; i < NUM_RAMDISKS; i++) { rd_disks[i] = alloc_disk(1); if (!rd_disks[i]) @@ -436,12 +356,6 @@ static int __init rd_init (void) add_disk(rd_disks[i]); } -#ifdef CONFIG_BLK_DEV_INITRD - /* We ought to separate initrd operations here */ - set_capacity(initrd_disk, (initrd_end-initrd_start+511)>>9); - add_disk(initrd_disk); -#endif - /* rd_size is given in kB */ printk("RAMDISK driver initialized: " "%d RAM disks of %dK size %d blocksize\n", @@ -451,9 +365,6 @@ static int __init rd_init (void) out: while (i--) put_disk(rd_disks[i]); -#ifdef CONFIG_BLK_DEV_INITRD - put_disk(initrd_disk); -#endif return err; } -- 2.53.0