diff options
author | Peter Oberparleiter <peter.oberparleiter@de.ibm.com> | 2009-12-07 06:51:30 -0500 |
---|---|---|
committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2009-12-07 06:51:31 -0500 |
commit | 454e1fa1ebae7cff707b2e3f12b775c263c8408b (patch) | |
tree | eab290fcacd6faaf7e01e3a637cb9678bb367c66 /drivers/s390/block/dasd_eckd.c | |
parent | 4257aaecffab77bad43e12057f56a5590b360f9f (diff) |
[S390] cio: split PGID settings and status
Split setting (driver wants feature enabled) and status (feature
setup was successful) for PGID related ccw device features so that
setup errors can be detected. Previously, incorrectly handled setup
errors could in rare cases lead to erratic I/O behavior and
permanently unusuable devices.
Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/block/dasd_eckd.c')
-rw-r--r-- | drivers/s390/block/dasd_eckd.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 417b97cd3f94..a8ec0731609e 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -86,7 +86,8 @@ dasd_eckd_probe (struct ccw_device *cdev) | |||
86 | int ret; | 86 | int ret; |
87 | 87 | ||
88 | /* set ECKD specific ccw-device options */ | 88 | /* set ECKD specific ccw-device options */ |
89 | ret = ccw_device_set_options(cdev, CCWDEV_ALLOW_FORCE); | 89 | ret = ccw_device_set_options(cdev, CCWDEV_ALLOW_FORCE | |
90 | CCWDEV_DO_PATHGROUP | CCWDEV_DO_MULTIPATH); | ||
90 | if (ret) { | 91 | if (ret) { |
91 | DBF_EVENT(DBF_WARNING, | 92 | DBF_EVENT(DBF_WARNING, |
92 | "dasd_eckd_probe: could not set ccw-device options " | 93 | "dasd_eckd_probe: could not set ccw-device options " |
@@ -1090,6 +1091,15 @@ dasd_eckd_check_characteristics(struct dasd_device *device) | |||
1090 | struct dasd_block *block; | 1091 | struct dasd_block *block; |
1091 | int is_known, rc; | 1092 | int is_known, rc; |
1092 | 1093 | ||
1094 | if (!ccw_device_is_pathgroup(device->cdev)) { | ||
1095 | dev_warn(&device->cdev->dev, | ||
1096 | "A channel path group could not be established\n"); | ||
1097 | return -EIO; | ||
1098 | } | ||
1099 | if (!ccw_device_is_multipath(device->cdev)) { | ||
1100 | dev_info(&device->cdev->dev, | ||
1101 | "The DASD is not operating in multipath mode\n"); | ||
1102 | } | ||
1093 | private = (struct dasd_eckd_private *) device->private; | 1103 | private = (struct dasd_eckd_private *) device->private; |
1094 | if (!private) { | 1104 | if (!private) { |
1095 | private = kzalloc(sizeof(*private), GFP_KERNEL | GFP_DMA); | 1105 | private = kzalloc(sizeof(*private), GFP_KERNEL | GFP_DMA); |