Skip to content

Commit 1214fd7

Browse files
KAGA-KOKOmartinkpetersen
authored andcommitted
scsi: sr: Avoid that opening a CD-ROM hangs with runtime power management enabled
Surround scsi_execute() calls with scsi_autopm_get_device() and scsi_autopm_put_device(). Note: removing sr_mutex protection from the scsi_cd_get() and scsi_cd_put() calls is safe because the purpose of sr_mutex is to serialize cdrom_*() calls. This patch avoids that complaints similar to the following appear in the kernel log if runtime power management is enabled: INFO: task systemd-udevd:650 blocked for more than 120 seconds. Not tainted 4.18.0-rc7-dbg+ #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. systemd-udevd D28176 650 513 0x00000104 Call Trace: __schedule+0x444/0xfe0 schedule+0x4e/0xe0 schedule_preempt_disabled+0x18/0x30 __mutex_lock+0x41c/0xc70 mutex_lock_nested+0x1b/0x20 __blkdev_get+0x106/0x970 blkdev_get+0x22c/0x5a0 blkdev_open+0xe9/0x100 do_dentry_open.isra.19+0x33e/0x570 vfs_open+0x7c/0xd0 path_openat+0x6e3/0x1120 do_filp_open+0x11c/0x1c0 do_sys_open+0x208/0x2d0 __x64_sys_openat+0x59/0x70 do_syscall_64+0x77/0x230 entry_SYSCALL_64_after_hwframe+0x49/0xbe Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com> Cc: Maurizio Lombardi <mlombard@redhat.com> Cc: Johannes Thumshirn <jthumshirn@suse.de> Cc: Alan Stern <stern@rowland.harvard.edu> Cc: <stable@vger.kernel.org> Tested-by: Johannes Thumshirn <jthumshirn@suse.de> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 09c2f95 commit 1214fd7

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

drivers/scsi/sr.c

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -523,18 +523,26 @@ static int sr_init_command(struct scsi_cmnd *SCpnt)
523523
static int sr_block_open(struct block_device *bdev, fmode_t mode)
524524
{
525525
struct scsi_cd *cd;
526+
struct scsi_device *sdev;
526527
int ret = -ENXIO;
527528

529+
cd = scsi_cd_get(bdev->bd_disk);
530+
if (!cd)
531+
goto out;
532+
533+
sdev = cd->device;
534+
scsi_autopm_get_device(sdev);
528535
check_disk_change(bdev);
529536

530537
mutex_lock(&sr_mutex);
531-
cd = scsi_cd_get(bdev->bd_disk);
532-
if (cd) {
533-
ret = cdrom_open(&cd->cdi, bdev, mode);
534-
if (ret)
535-
scsi_cd_put(cd);
536-
}
538+
ret = cdrom_open(&cd->cdi, bdev, mode);
537539
mutex_unlock(&sr_mutex);
540+
541+
scsi_autopm_put_device(sdev);
542+
if (ret)
543+
scsi_cd_put(cd);
544+
545+
out:
538546
return ret;
539547
}
540548

@@ -562,6 +570,8 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
562570
if (ret)
563571
goto out;
564572

573+
scsi_autopm_get_device(sdev);
574+
565575
/*
566576
* Send SCSI addressing ioctls directly to mid level, send other
567577
* ioctls to cdrom/block level.
@@ -570,15 +580,18 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
570580
case SCSI_IOCTL_GET_IDLUN:
571581
case SCSI_IOCTL_GET_BUS_NUMBER:
572582
ret = scsi_ioctl(sdev, cmd, argp);
573-
goto out;
583+
goto put;
574584
}
575585

576586
ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg);
577587
if (ret != -ENOSYS)
578-
goto out;
588+
goto put;
579589

580590
ret = scsi_ioctl(sdev, cmd, argp);
581591

592+
put:
593+
scsi_autopm_put_device(sdev);
594+
582595
out:
583596
mutex_unlock(&sr_mutex);
584597
return ret;

0 commit comments

Comments
 (0)