[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: Peter Oberparleiter <peter.oberparleiter@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
bcff5cd667
commit
329b785bce
|
@ -242,28 +242,10 @@ s390_subchannel_remove_chpid(struct device *dev, void *data)
|
|||
if (sch->vpm == mask)
|
||||
goto out_unreg;
|
||||
|
||||
if ((sch->schib.scsw.actl & (SCSW_ACTL_CLEAR_PEND |
|
||||
SCSW_ACTL_HALT_PEND |
|
||||
SCSW_ACTL_START_PEND |
|
||||
SCSW_ACTL_RESUME_PEND)) &&
|
||||
(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)) {
|
||||
if ((sch->schib.scsw.actl & SCSW_ACTL_DEVACT) &&
|
||||
(sch->schib.scsw.actl & SCSW_ACTL_SCHACT) &&
|
||||
(sch->schib.pmcw.lpum == mask) &&
|
||||
(sch->vpm == 0)) {
|
||||
int cc;
|
||||
|
||||
cc = cio_clear(sch);
|
||||
|
|
Loading…
Reference in New Issue