mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-17 01:04:19 +08:00
[S390] dasd: Prevent deadlock during suspend/resume.
The freeze callback may set a stop bit so that a worker thread could not start I/O. The discipline specific freeze function waits for the worker to be completed. Set the stop_bit after the discipline specific freeze function has returned and no worker is running. Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
5a27e60dec
commit
6f272b9cec
@ -2769,6 +2769,10 @@ int dasd_generic_pm_freeze(struct ccw_device *cdev)
|
|||||||
|
|
||||||
if (IS_ERR(device))
|
if (IS_ERR(device))
|
||||||
return PTR_ERR(device);
|
return PTR_ERR(device);
|
||||||
|
|
||||||
|
if (device->discipline->freeze)
|
||||||
|
rc = device->discipline->freeze(device);
|
||||||
|
|
||||||
/* disallow new I/O */
|
/* disallow new I/O */
|
||||||
dasd_device_set_stop_bits(device, DASD_STOPPED_PM);
|
dasd_device_set_stop_bits(device, DASD_STOPPED_PM);
|
||||||
/* clear active requests */
|
/* clear active requests */
|
||||||
@ -2805,9 +2809,6 @@ int dasd_generic_pm_freeze(struct ccw_device *cdev)
|
|||||||
list_splice_tail(&freeze_queue, &device->ccw_queue);
|
list_splice_tail(&freeze_queue, &device->ccw_queue);
|
||||||
spin_unlock_irq(get_ccwdev_lock(cdev));
|
spin_unlock_irq(get_ccwdev_lock(cdev));
|
||||||
|
|
||||||
if (device->discipline->freeze)
|
|
||||||
rc = device->discipline->freeze(device);
|
|
||||||
|
|
||||||
dasd_put_device(device);
|
dasd_put_device(device);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user