[patch 1/13] s390: fix I/O termination race in cio.

From: Martin Schwidefsky
Date: Mon Apr 24 2006 - 11:02:20 EST


From: Peter Oberparleiter <peter.oberparleiter@xxxxxxxxxx>

[patch 1/13] 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@xxxxxxxxxx>
Signed-off-by: Martin Schwidefsky <schwidefsky@xxxxxxxxxx>
---

drivers/s390/cio/chsc.c | 26 ++++----------------------
1 files changed, 4 insertions(+), 22 deletions(-)

diff -urpN linux-2.6/drivers/s390/cio/chsc.c linux-2.6-patched/drivers/s390/cio/chsc.c
--- linux-2.6/drivers/s390/cio/chsc.c 2006-04-24 16:47:00.000000000 +0200
+++ linux-2.6-patched/drivers/s390/cio/chsc.c 2006-04-24 16:47:18.000000000 +0200
@@ -242,28 +242,10 @@ s390_subchannel_remove_chpid(struct devi
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);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/