diff options
author | Stefan Weinhuber <wein@de.ibm.com> | 2013-05-28 09:26:06 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2013-05-31 11:23:49 -0400 |
commit | 8b811bae69cf30e0a9676d7dcafb0cf16f13b3bc (patch) | |
tree | b6a9d97a043b908fef134c4766248d1bad0059bc /drivers/s390 | |
parent | b56433cb782d1cc7e44fc46d2ce3917fa75d2236 (diff) |
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>
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/block/dasd.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 4361d9772c42..d72a9216ee2e 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
@@ -3440,8 +3440,16 @@ void dasd_generic_path_event(struct ccw_device *cdev, int *path_event) | |||
3440 | device->path_data.opm &= ~eventlpm; | 3440 | device->path_data.opm &= ~eventlpm; |
3441 | device->path_data.ppm &= ~eventlpm; | 3441 | device->path_data.ppm &= ~eventlpm; |
3442 | device->path_data.npm &= ~eventlpm; | 3442 | device->path_data.npm &= ~eventlpm; |
3443 | if (oldopm && !device->path_data.opm) | 3443 | if (oldopm && !device->path_data.opm) { |
3444 | dasd_generic_last_path_gone(device); | 3444 | dev_warn(&device->cdev->dev, |
3445 | "No verified channel paths remain " | ||
3446 | "for the device\n"); | ||
3447 | DBF_DEV_EVENT(DBF_WARNING, device, | ||
3448 | "%s", "last verified path gone"); | ||
3449 | dasd_eer_write(device, NULL, DASD_EER_NOPATH); | ||
3450 | dasd_device_set_stop_bits(device, | ||
3451 | DASD_STOPPED_DC_WAIT); | ||
3452 | } | ||
3445 | } | 3453 | } |
3446 | if (path_event[chp] & PE_PATH_AVAILABLE) { | 3454 | if (path_event[chp] & PE_PATH_AVAILABLE) { |
3447 | device->path_data.opm &= ~eventlpm; | 3455 | device->path_data.opm &= ~eventlpm; |