diff options
Diffstat (limited to 'drivers/s390/cio/device.c')
-rw-r--r-- | drivers/s390/cio/device.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index ed25c8740a9c..fc916f5d7314 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -1426,6 +1426,8 @@ static enum io_sch_action sch_get_action(struct subchannel *sch) | |||
1426 | return IO_SCH_REPROBE; | 1426 | return IO_SCH_REPROBE; |
1427 | if (cdev->online) | 1427 | if (cdev->online) |
1428 | return IO_SCH_VERIFY; | 1428 | return IO_SCH_VERIFY; |
1429 | if (cdev->private->state == DEV_STATE_NOT_OPER) | ||
1430 | return IO_SCH_UNREG_ATTACH; | ||
1429 | return IO_SCH_NOP; | 1431 | return IO_SCH_NOP; |
1430 | } | 1432 | } |
1431 | 1433 | ||
@@ -1519,11 +1521,14 @@ static int io_subchannel_sch_event(struct subchannel *sch, int process) | |||
1519 | goto out; | 1521 | goto out; |
1520 | break; | 1522 | break; |
1521 | case IO_SCH_UNREG_ATTACH: | 1523 | case IO_SCH_UNREG_ATTACH: |
1524 | spin_lock_irqsave(sch->lock, flags); | ||
1522 | if (cdev->private->flags.resuming) { | 1525 | if (cdev->private->flags.resuming) { |
1523 | /* Device will be handled later. */ | 1526 | /* Device will be handled later. */ |
1524 | rc = 0; | 1527 | rc = 0; |
1525 | goto out; | 1528 | goto out_unlock; |
1526 | } | 1529 | } |
1530 | sch_set_cdev(sch, NULL); | ||
1531 | spin_unlock_irqrestore(sch->lock, flags); | ||
1527 | /* Unregister ccw device. */ | 1532 | /* Unregister ccw device. */ |
1528 | ccw_device_unregister(cdev); | 1533 | ccw_device_unregister(cdev); |
1529 | break; | 1534 | break; |