--- linux-work/drivers/char/raw.c-RAWIOCTL Fri Feb 1 07:26:07 2002 +++ linux-work/drivers/char/raw.c Fri Feb 8 15:06:21 2002 @@ -35,6 +35,7 @@ int raw_open(struct inode *, struct file *); int raw_release(struct inode *, struct file *); int raw_ctl_ioctl(struct inode *, struct file *, unsigned int, unsigned long); +int raw_ioctl(struct inode *, struct file *, unsigned int, unsigned long); static struct file_operations raw_fops = { @@ -42,6 +43,7 @@ write: raw_write, open: raw_open, release: raw_release, + ioctl: raw_ioctl, }; static struct file_operations raw_ctl_fops = { @@ -164,6 +166,25 @@ } + +/* Forward ioctls to the underlying block device. */ +int raw_ioctl(struct inode *inode, + struct file *flip, + unsigned int command, + unsigned long arg) +{ + int minor = minor(inode->i_rdev), err; + struct block_device *b; + if (minor < 1 && minor > 255) + return -ENODEV; + + b = raw_devices[minor].binding; + err = -EINVAL; + if (b && b->bd_inode && b->bd_op && b->bd_op->ioctl) { + err = b->bd_op->ioctl(b->bd_inode, NULL, command, arg); + } + return err; +} /* * Deal with ioctls against the raw-device control interface, to bind