[S390] cio: fix quiesce state
DEV_STATE_QUIESCE is used to stop all IO on a busy subchannel. This patch fixes the following problems related to the QUIESCE state: * Fix a potential race condition which could occur when the resulting state was DEV_STATE_OFFLINE. * Add missing locking around cio_disable_subchannel, ccw_device_cancel_halt_clear and the cdev's handler. * Loop until we know for sure that the subchannel is disabled. Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:

committed by
Martin Schwidefsky

orang tua
24a1872d64
melakukan
56e6b796fe
@@ -911,10 +911,7 @@ static void
|
||||
ccw_device_quiesce_done(struct ccw_device *cdev, enum dev_event dev_event)
|
||||
{
|
||||
ccw_device_set_timeout(cdev, 0);
|
||||
if (dev_event == DEV_EVENT_NOTOPER)
|
||||
cdev->private->state = DEV_STATE_NOT_OPER;
|
||||
else
|
||||
cdev->private->state = DEV_STATE_OFFLINE;
|
||||
cdev->private->state = DEV_STATE_NOT_OPER;
|
||||
wake_up(&cdev->private->wait_q);
|
||||
}
|
||||
|
||||
@@ -924,17 +921,11 @@ ccw_device_quiesce_timeout(struct ccw_device *cdev, enum dev_event dev_event)
|
||||
int ret;
|
||||
|
||||
ret = ccw_device_cancel_halt_clear(cdev);
|
||||
switch (ret) {
|
||||
case 0:
|
||||
cdev->private->state = DEV_STATE_OFFLINE;
|
||||
wake_up(&cdev->private->wait_q);
|
||||
break;
|
||||
case -ENODEV:
|
||||
if (ret == -EBUSY) {
|
||||
ccw_device_set_timeout(cdev, HZ/10);
|
||||
} else {
|
||||
cdev->private->state = DEV_STATE_NOT_OPER;
|
||||
wake_up(&cdev->private->wait_q);
|
||||
break;
|
||||
default:
|
||||
ccw_device_set_timeout(cdev, HZ/10);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user