aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/block/dasd_eckd.c
diff options
context:
space:
mode:
authorPeter Oberparleiter <peter.oberparleiter@de.ibm.com>2009-12-07 06:51:30 -0500
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>2009-12-07 06:51:31 -0500
commit454e1fa1ebae7cff707b2e3f12b775c263c8408b (patch)
treeeab290fcacd6faaf7e01e3a637cb9678bb367c66 /drivers/s390/block/dasd_eckd.c
parent4257aaecffab77bad43e12057f56a5590b360f9f (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.c12
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);