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