diff options
author | Stefan Haberland <stefan.haberland@de.ibm.com> | 2010-05-27 01:27:09 +0400 |
---|---|---|
committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2010-05-27 01:27:09 +0400 |
commit | a23ed009a726feeafdbabeaf5f0bde1a3f04d121 (patch) | |
tree | cd2448ca9544f23acacc40e5ab2b95b4636ef923 /drivers/s390/block/dasd.c | |
parent | 094f2100d6bb16ef0c4f82167cc55173ca22ee93 (diff) | |
download | linux-a23ed009a726feeafdbabeaf5f0bde1a3f04d121.tar.xz |
[S390] dasd: unit check handling during internal cio I/O
React on unit checks during cio internal I/O.
Handle as unsolicited interrupt and advice cio to retry.
Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/block/dasd.c')
-rw-r--r-- | drivers/s390/block/dasd.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 0e86247d791e..33975e922d65 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c @@ -1186,6 +1186,29 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, dasd_schedule_device_bh(device); } +enum uc_todo dasd_generic_uc_handler(struct ccw_device *cdev, struct irb *irb) +{ + struct dasd_device *device; + + device = dasd_device_from_cdev_locked(cdev); + + if (IS_ERR(device)) + goto out; + if (test_bit(DASD_FLAG_OFFLINE, &device->flags) || + device->state != device->target || + !device->discipline->handle_unsolicited_interrupt){ + dasd_put_device(device); + goto out; + } + + dasd_device_clear_timer(device); + device->discipline->handle_unsolicited_interrupt(device, irb); + dasd_put_device(device); +out: + return UC_TODO_RETRY; +} +EXPORT_SYMBOL_GPL(dasd_generic_uc_handler); + /* * If we have an error on a dasd_block layer request then we cancel * and return all further requests from the same dasd_block as well. |