@@ -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)
|
|||||||
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)
|
|||||||
* 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 @@ error_out:
|
|||||||
* 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)
|
|||||||
* 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,
|
|||||||
* 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,
|
|||||||
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)
|
|||||||
* 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
|
|||||||
|
|
||||||
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,
|
||||||
|
Reference in New Issue
Block a user