[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>

authored by Stefan Haberland and committed by Martin Schwidefsky a23ed009 094f2100

+25
+23
drivers/s390/block/dasd.c
··· 1186 dasd_schedule_device_bh(device); 1187 } 1188 1189 /* 1190 * If we have an error on a dasd_block layer request then we cancel 1191 * and return all further requests from the same dasd_block as well.
··· 1186 dasd_schedule_device_bh(device); 1187 } 1188 1189 + enum uc_todo dasd_generic_uc_handler(struct ccw_device *cdev, struct irb *irb) 1190 + { 1191 + struct dasd_device *device; 1192 + 1193 + device = dasd_device_from_cdev_locked(cdev); 1194 + 1195 + if (IS_ERR(device)) 1196 + goto out; 1197 + if (test_bit(DASD_FLAG_OFFLINE, &device->flags) || 1198 + device->state != device->target || 1199 + !device->discipline->handle_unsolicited_interrupt){ 1200 + dasd_put_device(device); 1201 + goto out; 1202 + } 1203 + 1204 + dasd_device_clear_timer(device); 1205 + device->discipline->handle_unsolicited_interrupt(device, irb); 1206 + dasd_put_device(device); 1207 + out: 1208 + return UC_TODO_RETRY; 1209 + } 1210 + EXPORT_SYMBOL_GPL(dasd_generic_uc_handler); 1211 + 1212 /* 1213 * If we have an error on a dasd_block layer request then we cancel 1214 * and return all further requests from the same dasd_block as well.
+1
drivers/s390/block/dasd_eckd.c
··· 3436 .freeze = dasd_generic_pm_freeze, 3437 .thaw = dasd_generic_restore_device, 3438 .restore = dasd_generic_restore_device, 3439 }; 3440 3441 /*
··· 3436 .freeze = dasd_generic_pm_freeze, 3437 .thaw = dasd_generic_restore_device, 3438 .restore = dasd_generic_restore_device, 3439 + .uc_handler = dasd_generic_uc_handler, 3440 }; 3441 3442 /*
+1
drivers/s390/block/dasd_int.h
··· 617 void dasd_generic_handle_state_change(struct dasd_device *); 618 int dasd_generic_pm_freeze(struct ccw_device *); 619 int dasd_generic_restore_device(struct ccw_device *); 620 621 int dasd_generic_read_dev_chars(struct dasd_device *, int, void *, int); 622 char *dasd_get_sense(struct irb *);
··· 617 void dasd_generic_handle_state_change(struct dasd_device *); 618 int dasd_generic_pm_freeze(struct ccw_device *); 619 int dasd_generic_restore_device(struct ccw_device *); 620 + enum uc_todo dasd_generic_uc_handler(struct ccw_device *, struct irb *); 621 622 int dasd_generic_read_dev_chars(struct dasd_device *, int, void *, int); 623 char *dasd_get_sense(struct irb *);