[PATCH] switch cciss

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2008-03-02 09:26:41 -05:00
parent 2b9ecd0333
commit ef7822c2fb

View File

@ -152,9 +152,9 @@ static ctlr_info_t *hba[MAX_CTLR];
static void do_cciss_request(struct request_queue *q); static void do_cciss_request(struct request_queue *q);
static irqreturn_t do_cciss_intr(int irq, void *dev_id); static irqreturn_t do_cciss_intr(int irq, void *dev_id);
static int cciss_open(struct inode *inode, struct file *filep); static int cciss_open(struct block_device *bdev, fmode_t mode);
static int cciss_release(struct inode *inode, struct file *filep); static int cciss_release(struct gendisk *disk, fmode_t mode);
static int cciss_ioctl(struct inode *inode, struct file *filep, static int cciss_ioctl(struct block_device *bdev, fmode_t mode,
unsigned int cmd, unsigned long arg); unsigned int cmd, unsigned long arg);
static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo); static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo);
@ -192,17 +192,18 @@ static void cciss_procinit(int i)
#endif /* CONFIG_PROC_FS */ #endif /* CONFIG_PROC_FS */
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg); static int cciss_compat_ioctl(struct block_device *, fmode_t,
unsigned, unsigned long);
#endif #endif
static struct block_device_operations cciss_fops = { static struct block_device_operations cciss_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.__open = cciss_open, .open = cciss_open,
.__release = cciss_release, .release = cciss_release,
.__ioctl = cciss_ioctl, .locked_ioctl = cciss_ioctl,
.getgeo = cciss_getgeo, .getgeo = cciss_getgeo,
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
.__compat_ioctl = cciss_compat_ioctl, .compat_ioctl = cciss_compat_ioctl,
#endif #endif
.revalidate_disk = cciss_revalidate, .revalidate_disk = cciss_revalidate,
}; };
@ -547,13 +548,13 @@ static inline drive_info_struct *get_drv(struct gendisk *disk)
/* /*
* Open. Make sure the device is really there. * Open. Make sure the device is really there.
*/ */
static int cciss_open(struct inode *inode, struct file *filep) static int cciss_open(struct block_device *bdev, fmode_t mode)
{ {
ctlr_info_t *host = get_host(inode->i_bdev->bd_disk); ctlr_info_t *host = get_host(bdev->bd_disk);
drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk); drive_info_struct *drv = get_drv(bdev->bd_disk);
#ifdef CCISS_DEBUG #ifdef CCISS_DEBUG
printk(KERN_DEBUG "cciss_open %s\n", inode->i_bdev->bd_disk->disk_name); printk(KERN_DEBUG "cciss_open %s\n", bdev->bd_disk->disk_name);
#endif /* CCISS_DEBUG */ #endif /* CCISS_DEBUG */
if (host->busy_initializing || drv->busy_configuring) if (host->busy_initializing || drv->busy_configuring)
@ -567,9 +568,9 @@ static int cciss_open(struct inode *inode, struct file *filep)
* for "raw controller". * for "raw controller".
*/ */
if (drv->heads == 0) { if (drv->heads == 0) {
if (iminor(inode) != 0) { /* not node 0? */ if (MINOR(bdev->bd_dev) != 0) { /* not node 0? */
/* if not node 0 make sure it is a partition = 0 */ /* if not node 0 make sure it is a partition = 0 */
if (iminor(inode) & 0x0f) { if (MINOR(bdev->bd_dev) & 0x0f) {
return -ENXIO; return -ENXIO;
/* if it is, make sure we have a LUN ID */ /* if it is, make sure we have a LUN ID */
} else if (drv->LunID == 0) { } else if (drv->LunID == 0) {
@ -587,14 +588,13 @@ static int cciss_open(struct inode *inode, struct file *filep)
/* /*
* Close. Sync first. * Close. Sync first.
*/ */
static int cciss_release(struct inode *inode, struct file *filep) static int cciss_release(struct gendisk *disk, fmode_t mode)
{ {
ctlr_info_t *host = get_host(inode->i_bdev->bd_disk); ctlr_info_t *host = get_host(disk);
drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk); drive_info_struct *drv = get_drv(disk);
#ifdef CCISS_DEBUG #ifdef CCISS_DEBUG
printk(KERN_DEBUG "cciss_release %s\n", printk(KERN_DEBUG "cciss_release %s\n", disk->disk_name);
inode->i_bdev->bd_disk->disk_name);
#endif /* CCISS_DEBUG */ #endif /* CCISS_DEBUG */
drv->usage_count--; drv->usage_count--;
@ -604,21 +604,23 @@ static int cciss_release(struct inode *inode, struct file *filep)
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
static int do_ioctl(struct file *f, unsigned cmd, unsigned long arg) static int do_ioctl(struct block_device *bdev, fmode_t mode,
unsigned cmd, unsigned long arg)
{ {
int ret; int ret;
lock_kernel(); lock_kernel();
ret = cciss_ioctl(f->f_path.dentry->d_inode, f, cmd, arg); ret = cciss_ioctl(bdev, mode, cmd, arg);
unlock_kernel(); unlock_kernel();
return ret; return ret;
} }
static int cciss_ioctl32_passthru(struct file *f, unsigned cmd, static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode,
unsigned long arg); unsigned cmd, unsigned long arg);
static int cciss_ioctl32_big_passthru(struct file *f, unsigned cmd, static int cciss_ioctl32_big_passthru(struct block_device *bdev, fmode_t mode,
unsigned long arg); unsigned cmd, unsigned long arg);
static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg) static int cciss_compat_ioctl(struct block_device *bdev, fmode_t mode,
unsigned cmd, unsigned long arg)
{ {
switch (cmd) { switch (cmd) {
case CCISS_GETPCIINFO: case CCISS_GETPCIINFO:
@ -636,20 +638,20 @@ static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg)
case CCISS_REGNEWD: case CCISS_REGNEWD:
case CCISS_RESCANDISK: case CCISS_RESCANDISK:
case CCISS_GETLUNINFO: case CCISS_GETLUNINFO:
return do_ioctl(f, cmd, arg); return do_ioctl(bdev, mode, cmd, arg);
case CCISS_PASSTHRU32: case CCISS_PASSTHRU32:
return cciss_ioctl32_passthru(f, cmd, arg); return cciss_ioctl32_passthru(bdev, mode, cmd, arg);
case CCISS_BIG_PASSTHRU32: case CCISS_BIG_PASSTHRU32:
return cciss_ioctl32_big_passthru(f, cmd, arg); return cciss_ioctl32_big_passthru(bdev, mode, cmd, arg);
default: default:
return -ENOIOCTLCMD; return -ENOIOCTLCMD;
} }
} }
static int cciss_ioctl32_passthru(struct file *f, unsigned cmd, static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode,
unsigned long arg) unsigned cmd, unsigned long arg)
{ {
IOCTL32_Command_struct __user *arg32 = IOCTL32_Command_struct __user *arg32 =
(IOCTL32_Command_struct __user *) arg; (IOCTL32_Command_struct __user *) arg;
@ -676,7 +678,7 @@ static int cciss_ioctl32_passthru(struct file *f, unsigned cmd,
if (err) if (err)
return -EFAULT; return -EFAULT;
err = do_ioctl(f, CCISS_PASSTHRU, (unsigned long)p); err = do_ioctl(bdev, mode, CCISS_PASSTHRU, (unsigned long)p);
if (err) if (err)
return err; return err;
err |= err |=
@ -687,8 +689,8 @@ static int cciss_ioctl32_passthru(struct file *f, unsigned cmd,
return err; return err;
} }
static int cciss_ioctl32_big_passthru(struct file *file, unsigned cmd, static int cciss_ioctl32_big_passthru(struct block_device *bdev, fmode_t mode,
unsigned long arg) unsigned cmd, unsigned long arg)
{ {
BIG_IOCTL32_Command_struct __user *arg32 = BIG_IOCTL32_Command_struct __user *arg32 =
(BIG_IOCTL32_Command_struct __user *) arg; (BIG_IOCTL32_Command_struct __user *) arg;
@ -717,7 +719,7 @@ static int cciss_ioctl32_big_passthru(struct file *file, unsigned cmd,
if (err) if (err)
return -EFAULT; return -EFAULT;
err = do_ioctl(file, CCISS_BIG_PASSTHRU, (unsigned long)p); err = do_ioctl(bdev, mode, CCISS_BIG_PASSTHRU, (unsigned long)p);
if (err) if (err)
return err; return err;
err |= err |=
@ -745,10 +747,9 @@ static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo)
/* /*
* ioctl * ioctl
*/ */
static int cciss_ioctl(struct inode *inode, struct file *filep, static int cciss_ioctl(struct block_device *bdev, fmode_t mode,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
struct block_device *bdev = inode->i_bdev;
struct gendisk *disk = bdev->bd_disk; struct gendisk *disk = bdev->bd_disk;
ctlr_info_t *host = get_host(disk); ctlr_info_t *host = get_host(disk);
drive_info_struct *drv = get_drv(disk); drive_info_struct *drv = get_drv(disk);
@ -1232,8 +1233,7 @@ static int cciss_ioctl(struct inode *inode, struct file *filep,
case SG_EMULATED_HOST: case SG_EMULATED_HOST:
case SG_IO: case SG_IO:
case SCSI_IOCTL_SEND_COMMAND: case SCSI_IOCTL_SEND_COMMAND:
return scsi_cmd_ioctl(disk->queue, disk, return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, argp);
filep ? filep->f_mode : 0, cmd, argp);
/* scsi_cmd_ioctl would normally handle these, below, but */ /* scsi_cmd_ioctl would normally handle these, below, but */
/* they aren't a good fit for cciss, as CD-ROMs are */ /* they aren't a good fit for cciss, as CD-ROMs are */