| From foo@baz Fri Feb 23 12:01:27 CET 2018 |
| From: Stefan Haberland <sth@linux.vnet.ibm.com> |
| Date: Thu, 26 Oct 2017 14:37:35 +0200 |
| Subject: s390/dasd: prevent prefix I/O error |
| |
| From: Stefan Haberland <sth@linux.vnet.ibm.com> |
| |
| |
| [ Upstream commit da340f921d3454f1521671c7a5a43ad3331fbe50 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/s390/block/dasd_eckd.c | 16 ++++++++++------ |
| 1 file changed, 10 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/s390/block/dasd_eckd.c |
| +++ b/drivers/s390/block/dasd_eckd.c |
| @@ -518,10 +518,12 @@ static int prefix_LRE(struct ccw1 *ccw, |
| pfxdata->validity.define_extent = 1; |
| |
| /* private uid is kept up to date, conf_data may be outdated */ |
| - if (startpriv->uid.type != UA_BASE_DEVICE) { |
| + if (startpriv->uid.type == UA_BASE_PAV_ALIAS) |
| pfxdata->validity.verify_base = 1; |
| - if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) |
| - pfxdata->validity.hyper_pav = 1; |
| + |
| + if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) { |
| + pfxdata->validity.verify_base = 1; |
| + pfxdata->validity.hyper_pav = 1; |
| } |
| |
| /* define extend data (mostly)*/ |
| @@ -2969,10 +2971,12 @@ static int prepare_itcw(struct itcw *itc |
| pfxdata.validity.define_extent = 1; |
| |
| /* private uid is kept up to date, conf_data may be outdated */ |
| - if (startpriv->uid.type != UA_BASE_DEVICE) { |
| + if (startpriv->uid.type == UA_BASE_PAV_ALIAS) |
| + pfxdata.validity.verify_base = 1; |
| + |
| + if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) { |
| pfxdata.validity.verify_base = 1; |
| - if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) |
| - pfxdata.validity.hyper_pav = 1; |
| + pfxdata.validity.hyper_pav = 1; |
| } |
| |
| switch (cmd) { |