|
@@ -523,18 +523,26 @@ static int sr_init_command(struct scsi_cmnd *SCpnt)
|
|
|
static int sr_block_open(struct block_device *bdev, fmode_t mode)
|
|
|
{
|
|
|
struct scsi_cd *cd;
|
|
|
+ struct scsi_device *sdev;
|
|
|
int ret = -ENXIO;
|
|
|
|
|
|
+ cd = scsi_cd_get(bdev->bd_disk);
|
|
|
+ if (!cd)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ sdev = cd->device;
|
|
|
+ scsi_autopm_get_device(sdev);
|
|
|
check_disk_change(bdev);
|
|
|
|
|
|
mutex_lock(&sr_mutex);
|
|
|
- cd = scsi_cd_get(bdev->bd_disk);
|
|
|
- if (cd) {
|
|
|
- ret = cdrom_open(&cd->cdi, bdev, mode);
|
|
|
- if (ret)
|
|
|
- scsi_cd_put(cd);
|
|
|
- }
|
|
|
+ ret = cdrom_open(&cd->cdi, bdev, mode);
|
|
|
mutex_unlock(&sr_mutex);
|
|
|
+
|
|
|
+ scsi_autopm_put_device(sdev);
|
|
|
+ if (ret)
|
|
|
+ scsi_cd_put(cd);
|
|
|
+
|
|
|
+out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -562,6 +570,8 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
|
|
|
+ scsi_autopm_get_device(sdev);
|
|
|
+
|
|
|
/*
|
|
|
* Send SCSI addressing ioctls directly to mid level, send other
|
|
|
* ioctls to cdrom/block level.
|
|
@@ -570,15 +580,18 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
|
|
|
case SCSI_IOCTL_GET_IDLUN:
|
|
|
case SCSI_IOCTL_GET_BUS_NUMBER:
|
|
|
ret = scsi_ioctl(sdev, cmd, argp);
|
|
|
- goto out;
|
|
|
+ goto put;
|
|
|
}
|
|
|
|
|
|
ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg);
|
|
|
if (ret != -ENOSYS)
|
|
|
- goto out;
|
|
|
+ goto put;
|
|
|
|
|
|
ret = scsi_ioctl(sdev, cmd, argp);
|
|
|
|
|
|
+put:
|
|
|
+ scsi_autopm_put_device(sdev);
|
|
|
+
|
|
|
out:
|
|
|
mutex_unlock(&sr_mutex);
|
|
|
return ret;
|