Newsgroups: comp.os.linux From: Andreas.Mengel@arbi.informatik.uni-oldenburg.de (Andreas Mengel) Subject: [ANNOUNCE] Some small but useful kernel patches Organization: University of Oldenburg, Germany Date: Mon, 18 Jan 1993 23:15:05 GMT Summary: Some small patches to the linux kernel Keywords: patch ram kernel ramdisk Hi linux community! Last night a friend of mine and me started playing around with the ramdisk, and we quickly ran into some small problems with it. For example we wanted to be able to configure the size of the ramdisk during boot (i.e. at the lilo-prompt, e.g. LILO boot: linux ramdisk=1024 to give us a 1MB ramdisk). This lead us to another problem: Now we wanted to be able to tell the size of the ramdisk after booting, e.g. during /etc/rc, to be able to automagically put a filesystem on it. So after looking through some kernel files we came up with the following little patches. They implement another command line argument for the kernel and a BLKGETSIZE ioctl for the ramdisk which returns the size of the ramdisk in kilobytes. NOTE that the patch to kernel/blk_drv/ll_rw_blk.c is not really needed (I don't know if it does any harm to initialize the ramdisk even if it is of size 0). This patch simply gets us around the -EBADF return from an open on /dev/ram. At the end of this posting you will also find a little program which makes use of the new ioctl (just for the show). P.S.: Please check that the device you want to use for the ramdisk should look as follows (major 1, minor 1): brw-r----- 1 root mem 1, 1 Jan 18 1993 /dev/ramdisk P.P.S.: The diffs were done against kernel-release 0.99.3. ----------SNIP-------SNAP--------- *** linux/kernel/blk_drv/ramdisk.c.orig Tue Dec 1 04:21:26 1992 --- linux/kernel/blk_drv/ramdisk.c Mon Jan 18 23:47:19 1993 *************** *** 5,10 **** --- 5,11 ---- */ + #include #include #include #include *************** *** 47,52 **** --- 48,71 ---- goto repeat; } + static int rd_ioctl(struct inode * inode, struct file * file, + unsigned int cmd, unsigned int arg) + { + if (!inode) + return -EINVAL; + if (MINOR(inode->i_rdev) != 1) + return -EINVAL; + switch (cmd) { + case BLKGETSIZE: /* Return device size */ + if (!arg) return -EINVAL; + verify_area((long *) arg, sizeof(long)); + put_fs_long(ramdisk_size, (long *) arg); + return 0; + default: + return -EINVAL; + } + } + static struct file_operations rd_fops = { NULL, /* lseek - default */ block_read, /* read - general block-dev read */ *************** *** 53,59 **** block_write, /* write - general block-dev write */ NULL, /* readdir - bad */ NULL, /* select */ ! NULL, /* ioctl */ NULL, /* mmap */ NULL, /* no special open code */ NULL /* no special release code */ --- 72,78 ---- block_write, /* write - general block-dev write */ NULL, /* readdir - bad */ NULL, /* select */ ! rd_ioctl, /* ioctl */ NULL, /* mmap */ NULL, /* no special open code */ NULL /* no special release code */ *** linux/init/main.c.orig Mon Jan 18 23:30:03 1993 --- linux/init/main.c Mon Jan 18 23:47:06 1993 *************** *** 185,190 **** --- 185,194 ---- ROOT_DEV = simple_strtoul(line+5,NULL,16); continue; } + if (!strncmp(line,"ramdisk=",8)) { + ramdisk_size = simple_strtoul(line+8,NULL,10); + continue; + } /* * Then check if it's an environment variable or * an option. *** linux/kernel/blk_drv/ll_rw_blk.c.orig Mon Jan 18 23:53:35 1993 --- linux/kernel/blk_drv/ll_rw_blk.c Mon Jan 18 23:53:56 1993 *************** *** 386,392 **** #ifdef CONFIG_BLK_DEV_HD mem_start = hd_init(mem_start,mem_end); #endif ! if (ramdisk_size) ! mem_start += rd_init(mem_start, ramdisk_size*1024); return mem_start; } --- 386,391 ---- #ifdef CONFIG_BLK_DEV_HD mem_start = hd_init(mem_start,mem_end); #endif ! mem_start += rd_init(mem_start, ramdisk_size*1024); return mem_start; } ----------SNIP-------SNAP--------- Now the little test-program: ----------SNIP-------SNAP--------- /* rdsize.c -- sample program for the new ramdisk ioctl simply prints out the current size of the ramdisk (c) 1993 A. Mengel, B. Eilers */ #include #include #include #include /* Set your device for the ramdisk here */ #define RAMDISK "/dev/ram" main(int ac, char *av[]) { long rc = 0; int dev = 0, i = 0, mode = 0; char *ram = RAMDISK; for ( i = 1 ; i < ac ; i++ ) if ( av[i][0]=='-') { if ( av[i][1] == 'q' ) { mode = 1; } else if ( av[i][1] == 'n' ) { mode = 2; } else fprintf(stderr,"usage: %s [-q|-n] [dev]\n",av[0]); } else ram = av[i]; if ( (dev = open(ram, O_RDONLY)) < 0) { if ( ! mode ) { printf("No Ramdisk\n"); } else if ( mode == 2 ) printf("0\n"); exit(1); } if (ioctl(dev, BLKGETSIZE, &rc)) { /* perhaps no BLKGETSIZE support in kernel */ /* this should only happen if the patch to kernel/blk_drv/ll_w_blk.c was not applied */ perror("ioctl"); if ( mode == 2 ) printf("0\n"); exit(-1); } if ( ! mode ) { printf("Ramdisksize=%d\n", rc); } else if ( mode == 2 ) printf("%i\n",rc); exit(0); } ----------SNIP-------SNAP--------- -- Bye, Falcon ------------------------------------------------------------------------------- Real Name: Andreas Mengel Bitnet: 169371@DOLUNI1 | UUCP: mengel@uniol.UUCP Internet: Andreas.Mengel@arbi.informatik.uni-oldenburg.de Inhouse: falcon@theoretica +-------------------------------------------------+ |Some say I'm lazy, but others say that's just me.| |Some say I'm crazy, I guess I'll always be! (GnR)| +-------------------------------------------------+