Commit 0338e291 authored by Al Viro's avatar Al Viro

[PATCH] switch sd

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 3e3c9c6f
...@@ -609,17 +609,15 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) ...@@ -609,17 +609,15 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
* In the latter case @inode and @filp carry an abridged amount * In the latter case @inode and @filp carry an abridged amount
* of information as noted above. * of information as noted above.
**/ **/
static int sd_open(struct inode *inode, struct file *filp) static int sd_open(struct block_device *bdev, fmode_t mode)
{ {
struct gendisk *disk = inode->i_bdev->bd_disk; struct scsi_disk *sdkp = scsi_disk_get(bdev->bd_disk);
struct scsi_disk *sdkp;
struct scsi_device *sdev; struct scsi_device *sdev;
int retval; int retval;
if (!(sdkp = scsi_disk_get(disk))) if (!sdkp)
return -ENXIO; return -ENXIO;
SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_open\n")); SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_open\n"));
sdev = sdkp->device; sdev = sdkp->device;
...@@ -633,14 +631,13 @@ static int sd_open(struct inode *inode, struct file *filp) ...@@ -633,14 +631,13 @@ static int sd_open(struct inode *inode, struct file *filp)
goto error_out; goto error_out;
if (sdev->removable || sdkp->write_prot) if (sdev->removable || sdkp->write_prot)
check_disk_change(inode->i_bdev); check_disk_change(bdev);
/* /*
* If the drive is empty, just let the open fail. * If the drive is empty, just let the open fail.
*/ */
retval = -ENOMEDIUM; retval = -ENOMEDIUM;
if (sdev->removable && !sdkp->media_present && if (sdev->removable && !sdkp->media_present && !(mode & FMODE_NDELAY))
!(filp->f_mode & FMODE_NDELAY))
goto error_out; goto error_out;
/* /*
...@@ -648,7 +645,7 @@ static int sd_open(struct inode *inode, struct file *filp) ...@@ -648,7 +645,7 @@ static int sd_open(struct inode *inode, struct file *filp)
* if the user expects to be able to write to the thing. * if the user expects to be able to write to the thing.
*/ */
retval = -EROFS; retval = -EROFS;
if (sdkp->write_prot && (filp->f_mode & FMODE_WRITE)) if (sdkp->write_prot && (mode & FMODE_WRITE))
goto error_out; goto error_out;
/* /*
...@@ -684,9 +681,8 @@ static int sd_open(struct inode *inode, struct file *filp) ...@@ -684,9 +681,8 @@ static int sd_open(struct inode *inode, struct file *filp)
* Note: may block (uninterruptible) if error recovery is underway * Note: may block (uninterruptible) if error recovery is underway
* on this disk. * on this disk.
**/ **/
static int sd_release(struct inode *inode, struct file *filp) static int sd_release(struct gendisk *disk, fmode_t mode)
{ {
struct gendisk *disk = inode->i_bdev->bd_disk;
struct scsi_disk *sdkp = scsi_disk(disk); struct scsi_disk *sdkp = scsi_disk(disk);
struct scsi_device *sdev = sdkp->device; struct scsi_device *sdev = sdkp->device;
...@@ -743,10 +739,9 @@ static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo) ...@@ -743,10 +739,9 @@ static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
* Note: most ioctls are forward onto the block subsystem or further * Note: most ioctls are forward onto the block subsystem or further
* down in the scsi subsystem. * down in the scsi subsystem.
**/ **/
static int sd_ioctl(struct inode * inode, struct file * filp, static int sd_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;
struct scsi_device *sdp = scsi_disk(disk)->device; struct scsi_device *sdp = scsi_disk(disk)->device;
void __user *p = (void __user *)arg; void __user *p = (void __user *)arg;
...@@ -762,7 +757,7 @@ static int sd_ioctl(struct inode * inode, struct file * filp, ...@@ -762,7 +757,7 @@ static int sd_ioctl(struct inode * inode, struct file * filp,
* access to the device is prohibited. * access to the device is prohibited.
*/ */
error = scsi_nonblockable_ioctl(sdp, cmd, p, error = scsi_nonblockable_ioctl(sdp, cmd, p,
filp ? filp->f_flags & O_NDELAY : 0); (mode & FMODE_NDELAY_NOW) != 0);
if (!scsi_block_when_processing_errors(sdp) || !error) if (!scsi_block_when_processing_errors(sdp) || !error)
return error; return error;
...@@ -776,8 +771,7 @@ static int sd_ioctl(struct inode * inode, struct file * filp, ...@@ -776,8 +771,7 @@ static int sd_ioctl(struct inode * inode, struct file * filp,
case SCSI_IOCTL_GET_BUS_NUMBER: case SCSI_IOCTL_GET_BUS_NUMBER:
return scsi_ioctl(sdp, cmd, p); return scsi_ioctl(sdp, cmd, p);
default: default:
error = scsi_cmd_ioctl(disk->queue, disk, error = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, p);
filp ? filp->f_mode : 0, cmd, p);
if (error != -ENOTTY) if (error != -ENOTTY)
return error; return error;
} }
...@@ -930,11 +924,10 @@ static void sd_rescan(struct device *dev) ...@@ -930,11 +924,10 @@ static void sd_rescan(struct device *dev)
* This gets directly called from VFS. When the ioctl * This gets directly called from VFS. When the ioctl
* is not recognized we go back to the other translation paths. * is not recognized we go back to the other translation paths.
*/ */
static long sd_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) static int sd_compat_ioctl(struct block_device *bdev, fmode_t mode,
unsigned int cmd, unsigned long arg)
{ {
struct block_device *bdev = file->f_path.dentry->d_inode->i_bdev; struct scsi_device *sdev = scsi_disk(bdev->bd_disk)->device;
struct gendisk *disk = bdev->bd_disk;
struct scsi_device *sdev = scsi_disk(disk)->device;
/* /*
* If we are in the middle of error recovery, don't let anyone * If we are in the middle of error recovery, don't let anyone
...@@ -962,12 +955,12 @@ static long sd_compat_ioctl(struct file *file, unsigned int cmd, unsigned long a ...@@ -962,12 +955,12 @@ static long sd_compat_ioctl(struct file *file, unsigned int cmd, unsigned long a
static struct block_device_operations sd_fops = { static struct block_device_operations sd_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.__open = sd_open, .open = sd_open,
.__release = sd_release, .release = sd_release,
.__ioctl = sd_ioctl, .locked_ioctl = sd_ioctl,
.getgeo = sd_getgeo, .getgeo = sd_getgeo,
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
.__compat_ioctl = sd_compat_ioctl, .compat_ioctl = sd_compat_ioctl,
#endif #endif
.media_changed = sd_media_changed, .media_changed = sd_media_changed,
.revalidate_disk = sd_revalidate_disk, .revalidate_disk = sd_revalidate_disk,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment