s390/dasd: fix handling of gone paths
When a path is gone and dasd_generic_path_event is called with a PE_PATH_GONE event, we must assume that any I/O request on that subchannel is still running. This is unlike the dasd_generic_notify handler and the CIO_NO_PATH event, which implies that the subchannel has been cleared. If dasd_generic_path_event finds that the path has been the last usable path, it must not call dasd_generic_last_path_gone (which would reset the state of running requests), but just set the DASD_STOPPED_DC_WAIT bit. Signed-off-by: Stefan Weinhuber <wein@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
b56433cb78
commit
8b811bae69
1 changed files with 10 additions and 2 deletions
|
@ -3440,8 +3440,16 @@ void dasd_generic_path_event(struct ccw_device *cdev, int *path_event)
|
|||
device->path_data.opm &= ~eventlpm;
|
||||
device->path_data.ppm &= ~eventlpm;
|
||||
device->path_data.npm &= ~eventlpm;
|
||||
if (oldopm && !device->path_data.opm)
|
||||
dasd_generic_last_path_gone(device);
|
||||
if (oldopm && !device->path_data.opm) {
|
||||
dev_warn(&device->cdev->dev,
|
||||
"No verified channel paths remain "
|
||||
"for the device\n");
|
||||
DBF_DEV_EVENT(DBF_WARNING, device,
|
||||
"%s", "last verified path gone");
|
||||
dasd_eer_write(device, NULL, DASD_EER_NOPATH);
|
||||
dasd_device_set_stop_bits(device,
|
||||
DASD_STOPPED_DC_WAIT);
|
||||
}
|
||||
}
|
||||
if (path_event[chp] & PE_PATH_AVAILABLE) {
|
||||
device->path_data.opm &= ~eventlpm;
|
||||
|
|
Loading…
Reference in a new issue