aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorStefan Haberland <stefan.haberland@de.ibm.com>2011-12-27 05:27:28 -0500
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2011-12-27 05:27:14 -0500
commitb38f27e8425a132ed2dc49ffb3741404e81363d8 (patch)
tree8f1e09bc2bd902ace0307d7a1639db349303829d /drivers/s390
parentb206181d636d416fde48c7f493d7ac5d935b57e3 (diff)
[S390] dasd: fix fixpoint divide exception in define_extent
If an IO request is build on an alias device without prefix enabled we try to calculate with zero data from the alias device. This triggers a BUG statement with fixpoint divide exception. This case is very unlikely and can only happen if the pathgroup is lost with an alias device already in use. Prevent the alias device from being used in this case. Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/block/dasd_alias.c10
-rw-r--r--drivers/s390/block/dasd_eckd.c2
2 files changed, 11 insertions, 1 deletions
diff --git a/drivers/s390/block/dasd_alias.c b/drivers/s390/block/dasd_alias.c
index c388eda1e2b1..553b3c5abb0a 100644
--- a/drivers/s390/block/dasd_alias.c
+++ b/drivers/s390/block/dasd_alias.c
@@ -705,6 +705,16 @@ struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *base_device)
705 if (lcu->pav == NO_PAV || 705 if (lcu->pav == NO_PAV ||
706 lcu->flags & (NEED_UAC_UPDATE | UPDATE_PENDING)) 706 lcu->flags & (NEED_UAC_UPDATE | UPDATE_PENDING))
707 return NULL; 707 return NULL;
708 if (unlikely(!(private->features.feature[8] & 0x01))) {
709 /*
710 * PAV enabled but prefix not, very unlikely
711 * seems to be a lost pathgroup
712 * use base device to do IO
713 */
714 DBF_DEV_EVENT(DBF_ERR, base_device, "%s",
715 "Prefix not enabled with PAV enabled\n");
716 return NULL;
717 }
708 718
709 spin_lock_irqsave(&lcu->lock, flags); 719 spin_lock_irqsave(&lcu->lock, flags);
710 alias_device = group->next; 720 alias_device = group->next;
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c
index 763f1bd9605a..bbcd5e9206ee 100644
--- a/drivers/s390/block/dasd_eckd.c
+++ b/drivers/s390/block/dasd_eckd.c
@@ -2397,7 +2397,7 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_cmd_single(
2397 sizeof(struct PFX_eckd_data)); 2397 sizeof(struct PFX_eckd_data));
2398 } else { 2398 } else {
2399 if (define_extent(ccw++, cqr->data, first_trk, 2399 if (define_extent(ccw++, cqr->data, first_trk,
2400 last_trk, cmd, startdev) == -EAGAIN) { 2400 last_trk, cmd, basedev) == -EAGAIN) {
2401 /* Clock not in sync and XRC is enabled. 2401 /* Clock not in sync and XRC is enabled.
2402 * Try again later. 2402 * Try again later.
2403 */ 2403 */