aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Haberland <sth@linux.vnet.ibm.com>2017-10-26 08:37:35 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2017-12-05 01:51:08 -0500
commitda340f921d3454f1521671c7a5a43ad3331fbe50 (patch)
tree457a7da246551a6cdfcb1100f192dd000a2c9d09
parentfbbd7f1a51965b50dd12924841da0d478f3da71b (diff)
s390/dasd: prevent prefix I/O error
Prevent that a prefix flag is set based on invalid configuration data. The validity.verify_base flag should only be set for alias devices. Usually the unit address type is either one of base, PAV alias or HyperPAV alias. But in cases where the unit address type is not set or any other value the validity.verify_base flag might be set as well. This would lead to follow on errors. Explicitly check for alias devices and set the validity flag only for them. Signed-off-by: Stefan Haberland <sth@linux.vnet.ibm.com> Reviewed-by: Jan Hoeppner <hoeppner@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--drivers/s390/block/dasd_eckd.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c
index 1a41ef496338..a2edf2a7ace9 100644
--- a/drivers/s390/block/dasd_eckd.c
+++ b/drivers/s390/block/dasd_eckd.c
@@ -531,10 +531,12 @@ static int prefix_LRE(struct ccw1 *ccw, struct PFX_eckd_data *pfxdata,
531 pfxdata->validity.define_extent = 1; 531 pfxdata->validity.define_extent = 1;
532 532
533 /* private uid is kept up to date, conf_data may be outdated */ 533 /* private uid is kept up to date, conf_data may be outdated */
534 if (startpriv->uid.type != UA_BASE_DEVICE) { 534 if (startpriv->uid.type == UA_BASE_PAV_ALIAS)
535 pfxdata->validity.verify_base = 1; 535 pfxdata->validity.verify_base = 1;
536 if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) 536
537 pfxdata->validity.hyper_pav = 1; 537 if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) {
538 pfxdata->validity.verify_base = 1;
539 pfxdata->validity.hyper_pav = 1;
538 } 540 }
539 541
540 rc = define_extent(NULL, dedata, trk, totrk, cmd, basedev, blksize); 542 rc = define_extent(NULL, dedata, trk, totrk, cmd, basedev, blksize);
@@ -3415,10 +3417,12 @@ static int prepare_itcw(struct itcw *itcw,
3415 pfxdata.validity.define_extent = 1; 3417 pfxdata.validity.define_extent = 1;
3416 3418
3417 /* private uid is kept up to date, conf_data may be outdated */ 3419 /* private uid is kept up to date, conf_data may be outdated */
3418 if (startpriv->uid.type != UA_BASE_DEVICE) { 3420 if (startpriv->uid.type == UA_BASE_PAV_ALIAS)
3421 pfxdata.validity.verify_base = 1;
3422
3423 if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) {
3419 pfxdata.validity.verify_base = 1; 3424 pfxdata.validity.verify_base = 1;
3420 if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) 3425 pfxdata.validity.hyper_pav = 1;
3421 pfxdata.validity.hyper_pav = 1;
3422 } 3426 }
3423 3427
3424 switch (cmd) { 3428 switch (cmd) {