[FIX] rd.c (was Re: Linux Status For 2.3.x: v 2.3.43)

From: willy@thepuffingroup.com
Date: Thu Feb 10 2000 - 21:16:25 EST


On Thu, Feb 10, 2000 at 10:05:11PM +0000, Alan Cox wrote:
> initrd is bust

Here's what we're using in linux/parisc. It seems to work. I dislike the
way we're constructing a dentry and a file, but at least we're no longer
constructing our own inode. Credit should also go to Thomas Bogendorfer
who also worked on this fix.

--- linux/drivers/block/rd.c Tue Jan 18 21:54:21 2000
+++ cvs/linux-2.3/drivers/block/rd.c Thu Feb 10 11:43:45 2000
@@ -368,6 +368,7 @@
         if (DEVICE_NR(inode->i_rdev) >= NUM_RAMDISKS)
                 return -ENXIO;
 
+ filp->f_op = &def_blk_fops;
         MOD_INC_USE_COUNT;
 
         return 0;
@@ -566,7 +567,7 @@
  */
 static void __init rd_load_image(kdev_t device, int offset, int unit)
 {
- struct inode inode, out_inode;
+ struct inode *inode, *out_inode;
         struct file infile, outfile;
         struct dentry in_dentry, out_dentry;
         mm_segment_t fs;
@@ -580,25 +581,27 @@
         ram_device = MKDEV(MAJOR_NR, unit);
 
         memset(&infile, 0, sizeof(infile));
- memset(&inode, 0, sizeof(inode));
         memset(&in_dentry, 0, sizeof(in_dentry));
- inode.i_rdev = device;
- init_waitqueue_head(&inode.i_wait);
+ inode = get_empty_inode();
+ inode->i_rdev = device;
+ inode->i_bdev = bdget(kdev_t_to_nr(device));
         infile.f_mode = 1; /* read only */
         infile.f_dentry = &in_dentry;
- in_dentry.d_inode = &inode;
+ in_dentry.d_inode = inode;
 
         memset(&outfile, 0, sizeof(outfile));
- memset(&out_inode, 0, sizeof(out_inode));
         memset(&out_dentry, 0, sizeof(out_dentry));
- out_inode.i_rdev = ram_device;
- init_waitqueue_head(&out_inode.i_wait);
+ out_inode = get_empty_inode();
+ out_inode->i_rdev = ram_device;
+ out_inode->i_bdev = bdget(kdev_t_to_nr(ram_device));
         outfile.f_mode = 3; /* read/write */
         outfile.f_dentry = &out_dentry;
- out_dentry.d_inode = &out_inode;
+ out_dentry.d_inode = out_inode;
 
- if (blkdev_open(&inode, &infile) != 0) return;
- if (blkdev_open(&out_inode, &outfile) != 0) return;
+ if (blkdev_open(inode, &infile) != 0)
+ goto free_inodes;
+ if (blkdev_open(out_inode, &outfile) != 0)
+ goto free_inodes;
 
         fs = get_fs();
         set_fs(KERNEL_DS);
@@ -661,10 +664,10 @@
                         rotate = 0;
                         invalidate_buffers(device);
                         if (infile.f_op->release)
- infile.f_op->release(&inode, &infile);
+ infile.f_op->release(inode, &infile);
                         printk("Please insert disk #%d and press ENTER\n", i/devblocks+1);
                         wait_for_keypress();
- if (blkdev_open(&inode, &infile) != 0) {
+ if (blkdev_open(inode, &infile) != 0) {
                                 printk("Error opening disk.\n");
                                 goto done;
                         }
@@ -687,8 +690,11 @@
 
 done:
         if (infile.f_op->release)
- infile.f_op->release(&inode, &infile);
+ infile.f_op->release(inode, &infile);
         set_fs(fs);
+free_inodes:
+ iput(inode);
+ iput(out_inode);
 }
 
 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Tue Feb 15 2000 - 21:00:19 EST