diff options
| author | Stefan Haberland <stefan.haberland@de.ibm.com> | 2011-01-05 12:48:05 +0100 | 
|---|---|---|
| committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2011-01-05 12:47:30 +0100 | 
| commit | 6f272b9cec285a9610a2acf101f694bc58bed37e (patch) | |
| tree | 5c333d47bfaefa34ccd827744f35381133f4444b | |
| parent | 5a27e60dec59a95bd7f8ae9a19ae2ede4f76395b (diff) | |
[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>
| -rw-r--r-- | drivers/s390/block/dasd.c | 7 | 
1 files changed, 4 insertions, 3 deletions
| diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index f16afe74464f..82d9ce36bd0b 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c @@ -2769,6 +2769,10 @@ int dasd_generic_pm_freeze(struct ccw_device *cdev)  	if (IS_ERR(device))  		return PTR_ERR(device); + +	if (device->discipline->freeze) +		rc = device->discipline->freeze(device); +  	/* disallow new I/O  */  	dasd_device_set_stop_bits(device, DASD_STOPPED_PM);  	/* clear active requests */ @@ -2805,9 +2809,6 @@ int dasd_generic_pm_freeze(struct ccw_device *cdev)  	list_splice_tail(&freeze_queue, &device->ccw_queue);  	spin_unlock_irq(get_ccwdev_lock(cdev)); -	if (device->discipline->freeze) -		rc = device->discipline->freeze(device); -  	dasd_put_device(device);  	return rc;  } | 
