Commit 329b785b authored by Peter Oberparleiter's avatar Peter Oberparleiter Committed by Linus Torvalds

[PATCH] s390: fix I/O termination race in cio

Fix a race condition in the I/O termination logic.  The race can cause I/O to
a dasd device to fail with no retry left after turning one channel path to the
device off and on multiple times.
Signed-off-by: default avatarPeter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent bcff5cd6
...@@ -242,28 +242,10 @@ s390_subchannel_remove_chpid(struct device *dev, void *data) ...@@ -242,28 +242,10 @@ s390_subchannel_remove_chpid(struct device *dev, void *data)
if (sch->vpm == mask) if (sch->vpm == mask)
goto out_unreg; goto out_unreg;
if ((sch->schib.scsw.actl & (SCSW_ACTL_CLEAR_PEND | if ((sch->schib.scsw.actl & SCSW_ACTL_DEVACT) &&
SCSW_ACTL_HALT_PEND | (sch->schib.scsw.actl & SCSW_ACTL_SCHACT) &&
SCSW_ACTL_START_PEND | (sch->schib.pmcw.lpum == mask) &&
SCSW_ACTL_RESUME_PEND)) && (sch->vpm == 0)) {
(sch->schib.pmcw.lpum == mask)) {
int cc = cio_cancel(sch);
if (cc == -ENODEV)
goto out_unreg;
if (cc == -EINVAL) {
cc = cio_clear(sch);
if (cc == -ENODEV)
goto out_unreg;
/* Call handler. */
if (sch->driver && sch->driver->termination)
sch->driver->termination(&sch->dev);
goto out_unlock;
}
} else if ((sch->schib.scsw.actl & SCSW_ACTL_DEVACT) &&
(sch->schib.scsw.actl & SCSW_ACTL_SCHACT) &&
(sch->schib.pmcw.lpum == mask)) {
int cc; int cc;
cc = cio_clear(sch); cc = cio_clear(sch);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment