Re: Fwd: Waking up from resume locks up on sr device

Joe Breuer
2023-06-11T09:06:58Z

I'm the reporter of this issue.

I just tried this patch against 6.3.4, and it completely fixes my
suspend/resume issue.

The optical drive stays usable after resume, even suspending/resuming
during playback of CDDA content works flawlessly and playback resumes
seamlessly after system resume.

So, from my perspective: Good one!

So long,
Joe

On 10.06.23 17:03, Bart Van Assche wrote:
> On 6/10/23 06:27, Bagas Sanjaya wrote:
>> On 6/10/23 15:55, Pavel Machek wrote:
>>>>> #regzbot introduced: v5.0..v6.4-rc5
>>>>> https://bugzilla.kernel.org/show_bug.cgi?id=217530
>>>>> #regzbot title: Waking up from resume locks up on SCSI CD/DVD drive
>>>>>
>>>> The reporter had found the culprit (via bisection), so:
>>>>
>>>> #regzbot introduced: a19a93e4c6a98c
>>> Maybe cc the authors of that commit?
>>
>> Ah! I forgot to do that! Thanks anyway.
>
> Hi Damien,
>
> Why does the ATA code call scsi_rescan_device() before system resume has
> finished? Would ATA devices still work with the patch below applied?
>
> Thanks,
>
> Bart.
>
>
> diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
> index 6a959c993dd8..be3971b7fd27 100644
> --- a/drivers/scsi/scsi_scan.c
> +++ b/drivers/scsi/scsi_scan.c
> @@ -1629,6 +1629,20 @@ void scsi_rescan_device(struct device *dev)
>  {
>      struct scsi_device *sdev = to_scsi_device(dev);
>
> +#ifdef CONFIG_PM_SLEEP
> +    /*
> +     * The ATA subsystem may call scsi_rescan_device() before resuming has
> +     * finished. If this happens, prevent a deadlock on the device_lock()
> +     * call by skipping rescanning.
> +     */
> +    if (dev->power.is_suspended)
> +        return;
> +#endif
> +
> +    /*
> +     * Serialize scsi_driver.rescan() calls and
> scsi_driver.gendrv.remove()
> +     * calls.
> +     */
>      device_lock(dev);
>
>      scsi_attach_vpd(sdev);
>