[rfc][patchlet] initrd fix 2.3.39

From: Mike Galbraith (mikeg@weiden.de)
Date: Sun Jan 16 2000 - 06:28:53 EST


Hi,

This patchlet allows me to load a gzipped initrd using loadlin.
Does it look reasonable, or does blkdev_open() need to die?

        -Mike

--- linux-2.3.39/drivers/block/rd.c.org Fri Jan 14 05:47:55 2000
+++ linux-2.3.39/drivers/block/rd.c Sun Jan 16 12:10:23 2000
@@ -336,31 +336,19 @@
         return 0;
 }
 
-
 static struct file_operations initrd_fops = {
- NULL, /* lseek */
- initrd_read, /* read */
- NULL, /* write */
- NULL, /* readdir */
- NULL, /* poll */
- NULL, /* ioctl */
- NULL, /* mmap */
- NULL, /* open */
- NULL, /* flush */
- initrd_release, /* release */
- NULL /* fsync */
+ release: initrd_release,
+ read: initrd_read,
 };
 
 #endif
 
-
 static int rd_open(struct inode * inode, struct file * filp)
 {
 #ifdef CONFIG_BLK_DEV_INITRD
         if (DEVICE_NR(inode->i_rdev) == INITRD_MINOR) {
                 if (!initrd_start) return -ENODEV;
                 initrd_users++;
- filp->f_op = &initrd_fops;
                 return 0;
         }
 #endif
@@ -560,6 +548,7 @@
          struct inode inode, out_inode;
         struct file infile, outfile;
         struct dentry in_dentry, out_dentry;
+ struct block_device *idev, *odev;
         mm_segment_t fs;
         kdev_t ram_device;
         int nblocks, i;
@@ -568,24 +557,34 @@
         unsigned short devblocks = 0;
         char rotator[4] = { '|' , '/' , '-' , '\\' };
 
+ if ((idev = bdget(device)) == NULL)
+ return;
+
         ram_device = MKDEV(MAJOR_NR, unit);
 
+ if ((odev = bdget(ram_device)) == NULL)
+ return;
+
         memset(&infile, 0, sizeof(infile));
         memset(&inode, 0, sizeof(inode));
         memset(&in_dentry, 0, sizeof(in_dentry));
+ inode.i_bdev = idev;
         inode.i_rdev = device;
         init_waitqueue_head(&inode.i_wait);
         infile.f_mode = 1; /* read only */
         infile.f_dentry = &in_dentry;
+ infile.f_op = &initrd_fops;
         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_bdev = odev;
         out_inode.i_rdev = ram_device;
         init_waitqueue_head(&out_inode.i_wait);
         outfile.f_mode = 3; /* read/write */
         outfile.f_dentry = &out_dentry;
+ outfile.f_op = &def_blk_fops;
         out_dentry.d_inode = &out_inode;
 
         if (blkdev_open(&inode, &infile) != 0) return;

-
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 : Sun Jan 23 2000 - 21:00:13 EST