rd.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:25k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * ramdisk.c - Multiple RAM disk driver - gzip-loading version - v. 0.8 beta.
  3.  * 
  4.  * (C) Chad Page, Theodore Ts'o, et. al, 1995. 
  5.  *
  6.  * This RAM disk is designed to have filesystems created on it and mounted
  7.  * just like a regular floppy disk.  
  8.  *  
  9.  * It also does something suggested by Linus: use the buffer cache as the
  10.  * RAM disk data.  This makes it possible to dynamically allocate the RAM disk
  11.  * buffer - with some consequences I have to deal with as I write this. 
  12.  * 
  13.  * This code is based on the original ramdisk.c, written mostly by
  14.  * Theodore Ts'o (TYT) in 1991.  The code was largely rewritten by
  15.  * Chad Page to use the buffer cache to store the RAM disk data in
  16.  * 1995; Theodore then took over the driver again, and cleaned it up
  17.  * for inclusion in the mainline kernel.
  18.  *
  19.  * The original CRAMDISK code was written by Richard Lyons, and
  20.  * adapted by Chad Page to use the new RAM disk interface.  Theodore
  21.  * Ts'o rewrote it so that both the compressed RAM disk loader and the
  22.  * kernel decompressor uses the same inflate.c codebase.  The RAM disk
  23.  * loader now also loads into a dynamic (buffer cache based) RAM disk,
  24.  * not the old static RAM disk.  Support for the old static RAM disk has
  25.  * been completely removed.
  26.  *
  27.  * Loadable module support added by Tom Dyas.
  28.  *
  29.  * Further cleanups by Chad Page (page0588@sundance.sjsu.edu):
  30.  * Cosmetic changes in #ifdef MODULE, code movement, etc.
  31.  *  When the RAM disk module is removed, free the protected buffers
  32.  *  Default RAM disk size changed to 2.88 MB
  33.  *
  34.  *  Added initrd: Werner Almesberger & Hans Lermen, Feb '96
  35.  *
  36.  * 4/25/96 : Made RAM disk size a parameter (default is now 4 MB) 
  37.  * - Chad Page
  38.  *
  39.  * Add support for fs images split across >1 disk, Paul Gortmaker, Mar '98
  40.  *
  41.  * Make block size and block size shift for RAM disks a global macro
  42.  * and set blk_size for -ENOSPC,     Werner Fink <werner@suse.de>, Apr '99
  43.  */
  44. #include <linux/config.h>
  45. #include <linux/sched.h>
  46. #include <linux/minix_fs.h>
  47. #include <linux/ext2_fs.h>
  48. #include <linux/romfs_fs.h>
  49. #include <linux/fs.h>
  50. #include <linux/kernel.h>
  51. #include <linux/hdreg.h>
  52. #include <linux/string.h>
  53. #include <linux/mm.h>
  54. #include <linux/mman.h>
  55. #include <linux/slab.h>
  56. #include <linux/ioctl.h>
  57. #include <linux/fd.h>
  58. #include <linux/module.h>
  59. #include <linux/init.h>
  60. #include <linux/devfs_fs_kernel.h>
  61. #include <linux/smp_lock.h>
  62. #include <asm/system.h>
  63. #include <asm/uaccess.h>
  64. #include <asm/byteorder.h>
  65. extern void wait_for_keypress(void);
  66. /*
  67.  * 35 has been officially registered as the RAMDISK major number, but
  68.  * so is the original MAJOR number of 1.  We're using 1 in
  69.  * include/linux/major.h for now
  70.  */
  71. #define MAJOR_NR RAMDISK_MAJOR
  72. #include <linux/blk.h>
  73. #include <linux/blkpg.h>
  74. /* The RAM disk size is now a parameter */
  75. #define NUM_RAMDISKS 16 /* This cannot be overridden (yet) */ 
  76. #ifndef MODULE
  77. /* We don't have to load RAM disks or gunzip them in a module. */
  78. #define RD_LOADER
  79. #define BUILD_CRAMDISK
  80. void rd_load(void);
  81. static int crd_load(struct file *fp, struct file *outfp);
  82. #ifdef CONFIG_BLK_DEV_INITRD
  83. static int initrd_users;
  84. #endif
  85. #endif
  86. /* Various static variables go here.  Most are used only in the RAM disk code.
  87.  */
  88. static unsigned long rd_length[NUM_RAMDISKS]; /* Size of RAM disks in bytes   */
  89. static int rd_hardsec[NUM_RAMDISKS]; /* Size of real blocks in bytes */
  90. static int rd_blocksizes[NUM_RAMDISKS]; /* Size of 1024 byte blocks :)  */
  91. static int rd_kbsize[NUM_RAMDISKS]; /* Size in blocks of 1024 bytes */
  92. static devfs_handle_t devfs_handle;
  93. static struct block_device *rd_bdev[NUM_RAMDISKS];/* Protected device data */
  94. /*
  95.  * Parameters for the boot-loading of the RAM disk.  These are set by
  96.  * init/main.c (from arguments to the kernel command line) or from the
  97.  * architecture-specific setup routine (from the stored boot sector
  98.  * information). 
  99.  */
  100. int rd_size = CONFIG_BLK_DEV_RAM_SIZE; /* Size of the RAM disks */
  101. /*
  102.  * It would be very desirable to have a soft-blocksize (that in the case
  103.  * of the ramdisk driver is also the hardblocksize ;) of PAGE_SIZE because
  104.  * doing that we'll achieve a far better MM footprint. Using a rd_blocksize of
  105.  * BLOCK_SIZE in the worst case we'll make PAGE_SIZE/BLOCK_SIZE buffer-pages
  106.  * unfreeable. With a rd_blocksize of PAGE_SIZE instead we are sure that only
  107.  * 1 page will be protected. Depending on the size of the ramdisk you
  108.  * may want to change the ramdisk blocksize to achieve a better or worse MM
  109.  * behaviour. The default is still BLOCK_SIZE (needed by rd_load_image that
  110.  * supposes the filesystem in the image uses a BLOCK_SIZE blocksize).
  111.  */
  112. int rd_blocksize = BLOCK_SIZE; /* blocksize of the RAM disks */
  113. #ifndef MODULE
  114. int rd_doload; /* 1 = load RAM disk, 0 = don't load */
  115. int rd_prompt = 1; /* 1 = prompt for RAM disk, 0 = don't prompt */
  116. int rd_image_start; /* starting block # of image */
  117. #ifdef CONFIG_BLK_DEV_INITRD
  118. unsigned long initrd_start, initrd_end;
  119. int mount_initrd = 1; /* zero if initrd should not be mounted */
  120. int initrd_below_start_ok;
  121. static int __init no_initrd(char *str)
  122. {
  123. mount_initrd = 0;
  124. return 1;
  125. }
  126. __setup("noinitrd", no_initrd);
  127. /*
  128.  * initrd=start,size
  129.  *   start - phyical start address of initrd
  130.  *   size  - byte size of initrd
  131.  */
  132. static int __init set_initrd(char *str)
  133. {
  134. unsigned long start, size = 0;
  135. if (str)
  136. start = simple_strtoul(str, &str, 0);
  137. if (str && *str == ',')
  138. size = simple_strtoul(str + 1, NULL, 0);
  139. if (size) {
  140. initrd_start = (unsigned long)phys_to_virt(start);
  141. initrd_end = initrd_start + size;
  142. }
  143. return 1;
  144. }
  145. __setup("initrd=", set_initrd);
  146. #endif
  147. static int __init ramdisk_start_setup(char *str)
  148. {
  149. rd_image_start = simple_strtol(str,NULL,0);
  150. return 1;
  151. }
  152. static int __init load_ramdisk(char *str)
  153. {
  154. rd_doload = simple_strtol(str,NULL,0) & 3;
  155. return 1;
  156. }
  157. static int __init prompt_ramdisk(char *str)
  158. {
  159. rd_prompt = simple_strtol(str,NULL,0) & 1;
  160. return 1;
  161. }
  162. static int __init ramdisk_size(char *str)
  163. {
  164. rd_size = simple_strtol(str,NULL,0);
  165. return 1;
  166. }
  167. static int __init ramdisk_size2(char *str)
  168. {
  169. return ramdisk_size(str);
  170. }
  171. static int __init ramdisk_blocksize(char *str)
  172. {
  173. rd_blocksize = simple_strtol(str,NULL,0);
  174. return 1;
  175. }
  176. __setup("ramdisk_start=", ramdisk_start_setup);
  177. __setup("load_ramdisk=", load_ramdisk);
  178. __setup("prompt_ramdisk=", prompt_ramdisk);
  179. __setup("ramdisk=", ramdisk_size);
  180. __setup("ramdisk_size=", ramdisk_size2);
  181. __setup("ramdisk_blocksize=", ramdisk_blocksize);
  182. #endif
  183. /*
  184.  * Copyright (C) 2000 Linus Torvalds.
  185.  *               2000 Transmeta Corp.
  186.  * aops copied from ramfs.
  187.  */
  188. static void ramdisk_updatepage(struct page * page, int need_kmap)
  189. {
  190. if (!Page_Uptodate(page)) {
  191. struct buffer_head *bh = page->buffers;
  192. void * address;
  193. if (need_kmap)
  194. kmap(page);
  195. address = page_address(page);
  196. if (bh) {
  197. struct buffer_head *tmp = bh;
  198. do {
  199. if (!buffer_uptodate(tmp)) {
  200. memset(address, 0, tmp->b_size);
  201. mark_buffer_uptodate(tmp, 1);
  202. }
  203. address += tmp->b_size;
  204. tmp = tmp->b_this_page;
  205. } while (tmp != bh);
  206. } else
  207. memset(address, 0, PAGE_CACHE_SIZE);
  208. if (need_kmap)
  209. kunmap(page);
  210. flush_dcache_page(page);
  211. SetPageUptodate(page);
  212. }
  213. }
  214. static int ramdisk_readpage(struct file *file, struct page * page)
  215. {
  216. ramdisk_updatepage(page, 1);
  217. UnlockPage(page);
  218. return 0;
  219. }
  220. static int ramdisk_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to)
  221. {
  222. ramdisk_updatepage(page, 0);
  223. SetPageDirty(page);
  224. return 0;
  225. }
  226. static int ramdisk_commit_write(struct file *file, struct page *page, unsigned offset, unsigned to)
  227. {
  228. return 0;
  229. }
  230. static struct address_space_operations ramdisk_aops = {
  231. readpage: ramdisk_readpage,
  232. writepage: fail_writepage,
  233. prepare_write: ramdisk_prepare_write,
  234. commit_write: ramdisk_commit_write,
  235. };
  236. static int rd_blkdev_pagecache_IO(int rw, struct buffer_head * sbh, int minor)
  237. {
  238. struct address_space * mapping;
  239. unsigned long index;
  240. int offset, size, err;
  241. err = 0;
  242. mapping = rd_bdev[minor]->bd_inode->i_mapping;
  243. /* writing a buffer cache not uptodate must not clear it */
  244. if (sbh->b_page->mapping == mapping) {
  245. if (rw == WRITE) {
  246. mark_buffer_uptodate(sbh, 1);
  247. SetPageDirty(sbh->b_page);
  248. }
  249. goto out;
  250. }
  251. index = sbh->b_rsector >> (PAGE_CACHE_SHIFT - 9);
  252. offset = (sbh->b_rsector << 9) & ~PAGE_CACHE_MASK;
  253. size = sbh->b_size;
  254. do {
  255. int count;
  256. struct page * page;
  257. char * src, * dst;
  258. count = PAGE_CACHE_SIZE - offset;
  259. if (count > size)
  260. count = size;
  261. size -= count;
  262. page = grab_cache_page(mapping, index);
  263. if (!page) {
  264. err = -ENOMEM;
  265. goto out;
  266. }
  267. ramdisk_updatepage(page, 1);
  268. index++;
  269. if (rw == READ) {
  270. src = kmap(page);
  271. src += offset;
  272. dst = bh_kmap(sbh);
  273. } else {
  274. dst = kmap(page);
  275. dst += offset;
  276. src = bh_kmap(sbh);
  277. }
  278. offset = 0;
  279. memcpy(dst, src, count);
  280. kunmap(page);
  281. bh_kunmap(sbh);
  282. if (rw == READ) {
  283. flush_dcache_page(page);
  284. } else {
  285. SetPageDirty(page);
  286. }
  287. UnlockPage(page);
  288. __free_page(page);
  289. } while (size);
  290.  out:
  291. return err;
  292. }
  293. /*
  294.  *  Basically, my strategy here is to set up a buffer-head which can't be
  295.  *  deleted, and make that my Ramdisk.  If the request is outside of the
  296.  *  allocated size, we must get rid of it...
  297.  *
  298.  * 19-JAN-1998  Richard Gooch <rgooch@atnf.csiro.au>  Added devfs support
  299.  *
  300.  */
  301. static int rd_make_request(request_queue_t * q, int rw, struct buffer_head *sbh)
  302. {
  303. unsigned int minor;
  304. unsigned long offset, len;
  305. minor = MINOR(sbh->b_rdev);
  306. if (minor >= NUM_RAMDISKS)
  307. goto fail;
  308. offset = sbh->b_rsector << 9;
  309. len = sbh->b_size;
  310. if ((offset + len) > rd_length[minor])
  311. goto fail;
  312. if (rw==READA)
  313. rw=READ;
  314. if ((rw != READ) && (rw != WRITE)) {
  315. printk(KERN_INFO "RAMDISK: bad command: %dn", rw);
  316. goto fail;
  317. }
  318. if (rd_blkdev_pagecache_IO(rw, sbh, minor))
  319. goto fail;
  320. sbh->b_end_io(sbh,1);
  321. return 0;
  322.  fail:
  323. sbh->b_end_io(sbh,0);
  324. return 0;
  325. static int rd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
  326. {
  327. int error = -EINVAL;
  328. unsigned int minor;
  329. if (!inode || !inode->i_rdev) 
  330. goto out;
  331. minor = MINOR(inode->i_rdev);
  332. switch (cmd) {
  333. case BLKFLSBUF:
  334. if (!capable(CAP_SYS_ADMIN))
  335. return -EACCES;
  336. /* special: we want to release the ramdisk memory,
  337.    it's not like with the other blockdevices where
  338.    this ioctl only flushes away the buffer cache. */
  339. error = -EBUSY;
  340. down(&inode->i_bdev->bd_sem);
  341. if (inode->i_bdev->bd_openers <= 2) {
  342. truncate_inode_pages(inode->i_mapping, 0);
  343. error = 0;
  344. }
  345. up(&inode->i_bdev->bd_sem);
  346. break;
  347.           case BLKGETSIZE:   /* Return device size */
  348. if (!arg)
  349. break;
  350. error = put_user(rd_kbsize[minor] << 1, (unsigned long *) arg);
  351. break;
  352.           case BLKGETSIZE64:
  353. error = put_user((u64)rd_kbsize[minor]<<10, (u64*)arg);
  354. break;
  355. case BLKROSET:
  356. case BLKROGET:
  357. case BLKSSZGET:
  358. error = blk_ioctl(inode->i_rdev, cmd, arg);
  359. };
  360. out:
  361. return error;
  362. }
  363. #ifdef CONFIG_BLK_DEV_INITRD
  364. static ssize_t initrd_read(struct file *file, char *buf,
  365.    size_t count, loff_t *ppos)
  366. {
  367. int left;
  368. left = initrd_end - initrd_start - *ppos;
  369. if (count > left) count = left;
  370. if (count == 0) return 0;
  371. copy_to_user(buf, (char *)initrd_start + *ppos, count);
  372. *ppos += count;
  373. return count;
  374. }
  375. static int initrd_release(struct inode *inode,struct file *file)
  376. {
  377. extern void free_initrd_mem(unsigned long, unsigned long);
  378. lock_kernel();
  379. if (!--initrd_users) {
  380. free_initrd_mem(initrd_start, initrd_end);
  381. initrd_start = 0;
  382. }
  383. unlock_kernel();
  384. blkdev_put(inode->i_bdev, BDEV_FILE);
  385. return 0;
  386. }
  387. static struct file_operations initrd_fops = {
  388. read: initrd_read,
  389. release: initrd_release,
  390. };
  391. #endif
  392. static int rd_open(struct inode * inode, struct file * filp)
  393. {
  394. int unit = DEVICE_NR(inode->i_rdev);
  395. #ifdef CONFIG_BLK_DEV_INITRD
  396. if (unit == INITRD_MINOR) {
  397. if (!initrd_start) return -ENODEV;
  398. initrd_users++;
  399. filp->f_op = &initrd_fops;
  400. return 0;
  401. }
  402. #endif
  403. if (unit >= NUM_RAMDISKS)
  404. return -ENXIO;
  405. /*
  406.  * Immunize device against invalidate_buffers() and prune_icache().
  407.  */
  408. if (rd_bdev[unit] == NULL) {
  409. rd_bdev[unit] = bdget(kdev_t_to_nr(inode->i_rdev));
  410. rd_bdev[unit]->bd_openers++;
  411. rd_bdev[unit]->bd_inode->i_mapping->a_ops = &ramdisk_aops;
  412. }
  413. return 0;
  414. }
  415. static struct block_device_operations rd_bd_op = {
  416. owner: THIS_MODULE,
  417. open: rd_open,
  418. ioctl: rd_ioctl,
  419. };
  420. #ifdef MODULE
  421. /* Before freeing the module, invalidate all of the protected buffers! */
  422. static void __exit rd_cleanup (void)
  423. {
  424. int i;
  425. for (i = 0 ; i < NUM_RAMDISKS; i++) {
  426. struct block_device *bdev = rd_bdev[i];
  427. rd_bdev[i] = NULL;
  428. if (bdev)
  429. blkdev_put(bdev, BDEV_FILE);
  430. destroy_buffers(MKDEV(MAJOR_NR, i));
  431. }
  432. devfs_unregister (devfs_handle);
  433. unregister_blkdev( MAJOR_NR, "ramdisk" );
  434. hardsect_size[MAJOR_NR] = NULL;
  435. blksize_size[MAJOR_NR] = NULL;
  436. blk_size[MAJOR_NR] = NULL;
  437. }
  438. #endif
  439. /* This is the registration and initialization section of the RAM disk driver */
  440. int __init rd_init (void)
  441. {
  442. int i;
  443. if (rd_blocksize > PAGE_SIZE || rd_blocksize < 512 ||
  444.     (rd_blocksize & (rd_blocksize-1)))
  445. {
  446. printk("RAMDISK: wrong blocksize %d, reverting to defaultsn",
  447.        rd_blocksize);
  448. rd_blocksize = BLOCK_SIZE;
  449. }
  450. if (register_blkdev(MAJOR_NR, "ramdisk", &rd_bd_op)) {
  451. printk("RAMDISK: Could not get major %d", MAJOR_NR);
  452. return -EIO;
  453. }
  454. blk_queue_make_request(BLK_DEFAULT_QUEUE(MAJOR_NR), &rd_make_request);
  455. for (i = 0; i < NUM_RAMDISKS; i++) {
  456. /* rd_size is given in kB */
  457. rd_length[i] = rd_size << 10;
  458. rd_hardsec[i] = rd_blocksize;
  459. rd_blocksizes[i] = rd_blocksize;
  460. rd_kbsize[i] = rd_size;
  461. }
  462. devfs_handle = devfs_mk_dir (NULL, "rd", NULL);
  463. devfs_register_series (devfs_handle, "%u", NUM_RAMDISKS,
  464.        DEVFS_FL_DEFAULT, MAJOR_NR, 0,
  465.        S_IFBLK | S_IRUSR | S_IWUSR,
  466.        &rd_bd_op, NULL);
  467. for (i = 0; i < NUM_RAMDISKS; i++)
  468. register_disk(NULL, MKDEV(MAJOR_NR,i), 1, &rd_bd_op, rd_size<<1);
  469. #ifdef CONFIG_BLK_DEV_INITRD
  470. /* We ought to separate initrd operations here */
  471. register_disk(NULL, MKDEV(MAJOR_NR,INITRD_MINOR), 1, &rd_bd_op, rd_size<<1);
  472. #endif
  473. hardsect_size[MAJOR_NR] = rd_hardsec; /* Size of the RAM disk blocks */
  474. blksize_size[MAJOR_NR] = rd_blocksizes; /* Avoid set_blocksize() check */
  475. blk_size[MAJOR_NR] = rd_kbsize; /* Size of the RAM disk in kB  */
  476. /* rd_size is given in kB */
  477. printk("RAMDISK driver initialized: "
  478.        "%d RAM disks of %dK size %d blocksizen",
  479.        NUM_RAMDISKS, rd_size, rd_blocksize);
  480. return 0;
  481. }
  482. #ifdef MODULE
  483. module_init(rd_init);
  484. module_exit(rd_cleanup);
  485. #endif
  486. /* loadable module support */
  487. MODULE_PARM     (rd_size, "1i");
  488. MODULE_PARM_DESC(rd_size, "Size of each RAM disk in kbytes.");
  489. MODULE_PARM     (rd_blocksize, "i");
  490. MODULE_PARM_DESC(rd_blocksize, "Blocksize of each RAM disk in bytes.");
  491. MODULE_LICENSE("GPL");
  492. /* End of non-loading portions of the RAM disk driver */
  493. #ifdef RD_LOADER 
  494. /*
  495.  * This routine tries to find a RAM disk image to load, and returns the
  496.  * number of blocks to read for a non-compressed image, 0 if the image
  497.  * is a compressed image, and -1 if an image with the right magic
  498.  * numbers could not be found.
  499.  *
  500.  * We currently check for the following magic numbers:
  501.  *  minix
  502.  *  ext2
  503.  * romfs
  504.  *  gzip
  505.  */
  506. static int __init 
  507. identify_ramdisk_image(kdev_t device, struct file *fp, int start_block)
  508. {
  509. const int size = 512;
  510. struct minix_super_block *minixsb;
  511. struct ext2_super_block *ext2sb;
  512. struct romfs_super_block *romfsb;
  513. int nblocks = -1;
  514. unsigned char *buf;
  515. buf = kmalloc(size, GFP_KERNEL);
  516. if (buf == 0)
  517. return -1;
  518. minixsb = (struct minix_super_block *) buf;
  519. ext2sb = (struct ext2_super_block *) buf;
  520. romfsb = (struct romfs_super_block *) buf;
  521. memset(buf, 0xe5, size);
  522. /*
  523.  * Read block 0 to test for gzipped kernel
  524.  */
  525. if (fp->f_op->llseek)
  526. fp->f_op->llseek(fp, start_block * BLOCK_SIZE, 0);
  527. fp->f_pos = start_block * BLOCK_SIZE;
  528. fp->f_op->read(fp, buf, size, &fp->f_pos);
  529. /*
  530.  * If it matches the gzip magic numbers, return -1
  531.  */
  532. if (buf[0] == 037 && ((buf[1] == 0213) || (buf[1] == 0236))) {
  533. printk(KERN_NOTICE
  534.        "RAMDISK: Compressed image found at block %dn",
  535.        start_block);
  536. nblocks = 0;
  537. goto done;
  538. }
  539. /* romfs is at block zero too */
  540. if (romfsb->word0 == ROMSB_WORD0 &&
  541.     romfsb->word1 == ROMSB_WORD1) {
  542. printk(KERN_NOTICE
  543.        "RAMDISK: romfs filesystem found at block %dn",
  544.        start_block);
  545. nblocks = (ntohl(romfsb->size)+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS;
  546. goto done;
  547. }
  548. /*
  549.  * Read block 1 to test for minix and ext2 superblock
  550.  */
  551. if (fp->f_op->llseek)
  552. fp->f_op->llseek(fp, (start_block+1) * BLOCK_SIZE, 0);
  553. fp->f_pos = (start_block+1) * BLOCK_SIZE;
  554. fp->f_op->read(fp, buf, size, &fp->f_pos);
  555. /* Try minix */
  556. if (minixsb->s_magic == MINIX_SUPER_MAGIC ||
  557.     minixsb->s_magic == MINIX_SUPER_MAGIC2) {
  558. printk(KERN_NOTICE
  559.        "RAMDISK: Minix filesystem found at block %dn",
  560.        start_block);
  561. nblocks = minixsb->s_nzones << minixsb->s_log_zone_size;
  562. goto done;
  563. }
  564. /* Try ext2 */
  565. if (ext2sb->s_magic == cpu_to_le16(EXT2_SUPER_MAGIC)) {
  566. printk(KERN_NOTICE
  567.        "RAMDISK: ext2 filesystem found at block %dn",
  568.        start_block);
  569. nblocks = le32_to_cpu(ext2sb->s_blocks_count);
  570. goto done;
  571. }
  572. printk(KERN_NOTICE
  573.        "RAMDISK: Couldn't find valid RAM disk image starting at %d.n",
  574.        start_block);
  575. done:
  576. if (fp->f_op->llseek)
  577. fp->f_op->llseek(fp, start_block * BLOCK_SIZE, 0);
  578. fp->f_pos = start_block * BLOCK_SIZE;
  579. kfree(buf);
  580. return nblocks;
  581. }
  582. /*
  583.  * This routine loads in the RAM disk image.
  584.  */
  585. static void __init rd_load_image(kdev_t device, int offset, int unit)
  586. {
  587.   struct inode *inode, *out_inode;
  588. struct file infile, outfile;
  589. struct dentry in_dentry, out_dentry;
  590. mm_segment_t fs;
  591. kdev_t ram_device;
  592. int nblocks, i;
  593. char *buf;
  594. unsigned short rotate = 0;
  595. unsigned short devblocks = 0;
  596. #if !defined(CONFIG_ARCH_S390) && !defined(CONFIG_PPC_ISERIES)
  597. char rotator[4] = { '|' , '/' , '-' , '\' };
  598. #endif
  599. ram_device = MKDEV(MAJOR_NR, unit);
  600. if ((inode = get_empty_inode()) == NULL)
  601. return;
  602. memset(&infile, 0, sizeof(infile));
  603. memset(&in_dentry, 0, sizeof(in_dentry));
  604. infile.f_mode = 1; /* read only */
  605. infile.f_dentry = &in_dentry;
  606. in_dentry.d_inode = inode;
  607. infile.f_op = &def_blk_fops;
  608. init_special_inode(inode, S_IFBLK | S_IRUSR, kdev_t_to_nr(device));
  609. if ((out_inode = get_empty_inode()) == NULL)
  610. goto free_inode;
  611. memset(&outfile, 0, sizeof(outfile));
  612. memset(&out_dentry, 0, sizeof(out_dentry));
  613. outfile.f_mode = 3; /* read/write */
  614. outfile.f_dentry = &out_dentry;
  615. out_dentry.d_inode = out_inode;
  616. outfile.f_op = &def_blk_fops;
  617. init_special_inode(out_inode, S_IFBLK | S_IRUSR | S_IWUSR, kdev_t_to_nr(ram_device));
  618. if (blkdev_open(inode, &infile) != 0) {
  619. iput(out_inode);
  620. goto free_inode;
  621. }
  622. if (blkdev_open(out_inode, &outfile) != 0)
  623. goto free_inodes;
  624. fs = get_fs();
  625. set_fs(KERNEL_DS);
  626. nblocks = identify_ramdisk_image(device, &infile, offset);
  627. if (nblocks < 0)
  628. goto done;
  629. if (nblocks == 0) {
  630. #ifdef BUILD_CRAMDISK
  631. if (crd_load(&infile, &outfile) == 0)
  632. goto successful_load;
  633. #else
  634. printk(KERN_NOTICE
  635.        "RAMDISK: Kernel does not support compressed "
  636.        "RAM disk imagesn");
  637. #endif
  638. goto done;
  639. }
  640. /*
  641.  * NOTE NOTE: nblocks suppose that the blocksize is BLOCK_SIZE, so
  642.  * rd_load_image will work only with filesystem BLOCK_SIZE wide!
  643.  * So make sure to use 1k blocksize while generating ext2fs
  644.  * ramdisk-images.
  645.  */
  646. if (nblocks > (rd_length[unit] >> BLOCK_SIZE_BITS)) {
  647. printk("RAMDISK: image too big! (%d/%ld blocks)n",
  648.        nblocks, rd_length[unit] >> BLOCK_SIZE_BITS);
  649. goto done;
  650. }
  651. /*
  652.  * OK, time to copy in the data
  653.  */
  654. buf = kmalloc(BLOCK_SIZE, GFP_KERNEL);
  655. if (buf == 0) {
  656. printk(KERN_ERR "RAMDISK: could not allocate buffern");
  657. goto done;
  658. }
  659. if (blk_size[MAJOR(device)])
  660. devblocks = blk_size[MAJOR(device)][MINOR(device)];
  661. #ifdef CONFIG_BLK_DEV_INITRD
  662. if (MAJOR(device) == MAJOR_NR && MINOR(device) == INITRD_MINOR)
  663. devblocks = nblocks;
  664. #endif
  665. if (devblocks == 0) {
  666. printk(KERN_ERR "RAMDISK: could not determine device sizen");
  667. goto done;
  668. }
  669. printk(KERN_NOTICE "RAMDISK: Loading %d blocks [%d disk%s] into ram disk... ", 
  670. nblocks, ((nblocks-1)/devblocks)+1, nblocks>devblocks ? "s" : "");
  671. for (i=0; i < nblocks; i++) {
  672. if (i && (i % devblocks == 0)) {
  673. printk("done disk #%d.n", i/devblocks);
  674. rotate = 0;
  675. if (infile.f_op->release(inode, &infile) != 0) {
  676. printk("Error closing the disk.n");
  677. goto noclose_input;
  678. }
  679. printk("Please insert disk #%d and press ENTERn", i/devblocks+1);
  680. wait_for_keypress();
  681. if (blkdev_open(inode, &infile) != 0)  {
  682. printk("Error opening disk.n");
  683. goto noclose_input;
  684. }
  685. infile.f_pos = 0;
  686. printk("Loading disk #%d... ", i/devblocks+1);
  687. }
  688. infile.f_op->read(&infile, buf, BLOCK_SIZE, &infile.f_pos);
  689. outfile.f_op->write(&outfile, buf, BLOCK_SIZE, &outfile.f_pos);
  690. #if !defined(CONFIG_ARCH_S390) && !defined(CONFIG_PPC_ISERIES)
  691. if (!(i % 16)) {
  692. printk("%cb", rotator[rotate & 0x3]);
  693. rotate++;
  694. }
  695. #endif
  696. }
  697. printk("done.n");
  698. kfree(buf);
  699. successful_load:
  700. ROOT_DEV = MKDEV(MAJOR_NR, unit);
  701. if (ROOT_DEVICE_NAME != NULL) strcpy (ROOT_DEVICE_NAME, "rd/0");
  702. done:
  703. infile.f_op->release(inode, &infile);
  704. noclose_input:
  705. blkdev_close(out_inode, &outfile);
  706. iput(inode);
  707. iput(out_inode);
  708. set_fs(fs);
  709. return;
  710. free_inodes: /* free inodes on error */ 
  711. iput(out_inode);
  712. infile.f_op->release(inode, &infile);
  713. free_inode:
  714. iput(inode);
  715. }
  716. #ifdef CONFIG_MAC_FLOPPY
  717. int swim3_fd_eject(int devnum);
  718. #endif
  719. static void __init rd_load_disk(int n)
  720. {
  721. if (rd_doload == 0)
  722. return;
  723. if (MAJOR(ROOT_DEV) != FLOPPY_MAJOR
  724. #ifdef CONFIG_BLK_DEV_INITRD
  725. && MAJOR(real_root_dev) != FLOPPY_MAJOR
  726. #endif
  727. #ifdef CONFIG_MTD_BLOCK
  728. && MAJOR(ROOT_DEV) != 31
  729. #endif
  730. )
  731. return;
  732. if (rd_prompt) {
  733. #ifdef CONFIG_BLK_DEV_FD
  734. floppy_eject();
  735. #endif
  736. #ifdef CONFIG_MAC_FLOPPY
  737. if(MAJOR(ROOT_DEV) == FLOPPY_MAJOR)
  738. swim3_fd_eject(MINOR(ROOT_DEV));
  739. else if(MAJOR(real_root_dev) == FLOPPY_MAJOR)
  740. swim3_fd_eject(MINOR(real_root_dev));
  741. #endif
  742. printk(KERN_NOTICE
  743.        "VFS: Insert root floppy disk to be loaded into RAM disk and press ENTERn");
  744. wait_for_keypress();
  745. }
  746. rd_load_image(ROOT_DEV,rd_image_start, n);
  747. }
  748. void __init rd_load(void)
  749. {
  750. rd_load_disk(0);
  751. }
  752. void __init rd_load_secondary(void)
  753. {
  754. rd_load_disk(1);
  755. }
  756. #ifdef CONFIG_BLK_DEV_INITRD
  757. void __init initrd_load(void)
  758. {
  759. rd_load_image(MKDEV(MAJOR_NR, INITRD_MINOR),rd_image_start,0);
  760. }
  761. #endif
  762. #endif /* RD_LOADER */
  763. #ifdef BUILD_CRAMDISK
  764. /*
  765.  * gzip declarations
  766.  */
  767. #define OF(args)  args
  768. #ifndef memzero
  769. #define memzero(s, n)     memset ((s), 0, (n))
  770. #endif
  771. typedef unsigned char  uch;
  772. typedef unsigned short ush;
  773. typedef unsigned long  ulg;
  774. #define INBUFSIZ 4096
  775. #define WSIZE 0x8000    /* window size--must be a power of two, and */
  776. /*  at least 32K for zip's deflate method */
  777. static uch *inbuf;
  778. static uch *window;
  779. static unsigned insize;  /* valid bytes in inbuf */
  780. static unsigned inptr;   /* index of next byte to be processed in inbuf */
  781. static unsigned outcnt;  /* bytes in output buffer */
  782. static int exit_code;
  783. static long bytes_out;
  784. static struct file *crd_infp, *crd_outfp;
  785. #define get_byte()  (inptr < insize ? inbuf[inptr++] : fill_inbuf())
  786. /* Diagnostic functions (stubbed out) */
  787. #define Assert(cond,msg)
  788. #define Trace(x)
  789. #define Tracev(x)
  790. #define Tracevv(x)
  791. #define Tracec(c,x)
  792. #define Tracecv(c,x)
  793. #define STATIC static
  794. static int  fill_inbuf(void);
  795. static void flush_window(void);
  796. static void *malloc(int size);
  797. static void free(void *where);
  798. static void error(char *m);
  799. static void gzip_mark(void **);
  800. static void gzip_release(void **);
  801. #include "../../lib/inflate.c"
  802. static void __init *malloc(int size)
  803. {
  804. return kmalloc(size, GFP_KERNEL);
  805. }
  806. static void __init free(void *where)
  807. {
  808. kfree(where);
  809. }
  810. static void __init gzip_mark(void **ptr)
  811. {
  812. }
  813. static void __init gzip_release(void **ptr)
  814. {
  815. }
  816. /* ===========================================================================
  817.  * Fill the input buffer. This is called only when the buffer is empty
  818.  * and at least one byte is really needed.
  819.  */
  820. static int __init fill_inbuf(void)
  821. {
  822. if (exit_code) return -1;
  823. insize = crd_infp->f_op->read(crd_infp, inbuf, INBUFSIZ,
  824.       &crd_infp->f_pos);
  825. if (insize == 0) return -1;
  826. inptr = 1;
  827. return inbuf[0];
  828. }
  829. /* ===========================================================================
  830.  * Write the output window window[0..outcnt-1] and update crc and bytes_out.
  831.  * (Used for the decompressed data only.)
  832.  */
  833. static void __init flush_window(void)
  834. {
  835.     ulg c = crc;         /* temporary variable */
  836.     unsigned n, written;
  837.     uch *in, ch;
  838.     
  839.     written = crd_outfp->f_op->write(crd_outfp, window, outcnt, &crd_outfp->f_pos);
  840.     if (written != outcnt && exit_code == 0) {
  841.      printk(KERN_ERR "RAMDISK: incomplete write (ramdisk too small?) "
  842. "(%d != %d)n", written, outcnt);
  843. exit_code = 1;
  844.     }
  845.     in = window;
  846.     for (n = 0; n < outcnt; n++) {
  847.     ch = *in++;
  848.     c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
  849.     }
  850.     crc = c;
  851.     bytes_out += (ulg)outcnt;
  852.     outcnt = 0;
  853. }
  854. static void __init error(char *x)
  855. {
  856. printk(KERN_ERR "%s", x);
  857. exit_code = 1;
  858. }
  859. static int __init 
  860. crd_load(struct file * fp, struct file *outfp)
  861. {
  862. int result;
  863. insize = 0; /* valid bytes in inbuf */
  864. inptr = 0; /* index of next byte to be processed in inbuf */
  865. outcnt = 0; /* bytes in output buffer */
  866. exit_code = 0;
  867. bytes_out = 0;
  868. crc = (ulg)0xffffffffL; /* shift register contents */
  869. crd_infp = fp;
  870. crd_outfp = outfp;
  871. inbuf = kmalloc(INBUFSIZ, GFP_KERNEL);
  872. if (inbuf == 0) {
  873. printk(KERN_ERR "RAMDISK: Couldn't allocate gzip buffern");
  874. return -1;
  875. }
  876. window = kmalloc(WSIZE, GFP_KERNEL);
  877. if (window == 0) {
  878. printk(KERN_ERR "RAMDISK: Couldn't allocate gzip windown");
  879. kfree(inbuf);
  880. return -1;
  881. }
  882. makecrc();
  883. result = gunzip();
  884. kfree(inbuf);
  885. kfree(window);
  886. return result;
  887. }
  888. #endif  /* BUILD_CRAMDISK */