Message ID | 20190801110630.82432-2-sth@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | sending DASD patches through linux-block | expand |
On 8/1/19 5:06 AM, Stefan Haberland wrote: > After getting a storage server event that causes the DASD device driver > to update its unit address configuration during a device shutdown there is > the possibility of an endless loop in the device driver. > > In the system log there will be ongoing DASD error messages with RC: -19. > > The reason is that the loop starting the ruac request only terminates when > the retry counter is decreased to 0. But in the sleep_on function there are > early exit paths that do not decrease the retry counter. > > Prevent an endless loop by handling those cases separately. > > Remove the unnecessary do..while loop since the sleep_on function takes > care of retries by itself. Applied for 5.3, thanks.
diff --git a/drivers/s390/block/dasd_alias.c b/drivers/s390/block/dasd_alias.c index b9ce93e9df89..99f86612f775 100644 --- a/drivers/s390/block/dasd_alias.c +++ b/drivers/s390/block/dasd_alias.c @@ -383,6 +383,20 @@ suborder_not_supported(struct dasd_ccw_req *cqr) char msg_format; char msg_no; + /* + * intrc values ENODEV, ENOLINK and EPERM + * will be optained from sleep_on to indicate that no + * IO operation can be started + */ + if (cqr->intrc == -ENODEV) + return 1; + + if (cqr->intrc == -ENOLINK) + return 1; + + if (cqr->intrc == -EPERM) + return 1; + sense = dasd_get_sense(&cqr->irb); if (!sense) return 0; @@ -447,12 +461,8 @@ static int read_unit_address_configuration(struct dasd_device *device, lcu->flags &= ~NEED_UAC_UPDATE; spin_unlock_irqrestore(&lcu->lock, flags); - do { - rc = dasd_sleep_on(cqr); - if (rc && suborder_not_supported(cqr)) - return -EOPNOTSUPP; - } while (rc && (cqr->retries > 0)); - if (rc) { + rc = dasd_sleep_on(cqr); + if (rc && !suborder_not_supported(cqr)) { spin_lock_irqsave(&lcu->lock, flags); lcu->flags |= NEED_UAC_UPDATE; spin_unlock_irqrestore(&lcu->lock, flags);