From 25a2001a285e187d99ea347693bedd73b3e0722a Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Mon, 7 Aug 2006 17:00:28 +0200 Subject: [PATCH 1/3] [S390] tape class return value handling. Without this patch register_tape_dev() will always fail, but might return a value that is not an error number. This will lead to accesses to already freed memory areas... Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky --- drivers/s390/char/tape_class.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/s390/char/tape_class.c b/drivers/s390/char/tape_class.c index 643b6d078563..56b87618b100 100644 --- a/drivers/s390/char/tape_class.c +++ b/drivers/s390/char/tape_class.c @@ -76,7 +76,7 @@ struct tape_class_device *register_tape_dev( device, "%s", tcd->device_name ); - rc = PTR_ERR(tcd->class_device); + rc = IS_ERR(tcd->class_device) ? PTR_ERR(tcd->class_device) : 0; if (rc) goto fail_with_cdev; rc = sysfs_create_link( From 4bc0c4f9e74e7a5d62ef4db923b377f2aa474a8f Mon Sep 17 00:00:00 2001 From: Cornelia Huck Date: Mon, 7 Aug 2006 17:00:30 +0200 Subject: [PATCH 2/3] [S390] retry after deferred condition code. Do a retry of read device characteristics / read configuration data when a deferred condition code 1 is encountered in ccw_device_wake_up(). Signed-off-by: Cornelia Huck Signed-off-by: Martin Schwidefsky --- drivers/s390/cio/device_ops.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c index a60124264bee..9e3de0bd59b5 100644 --- a/drivers/s390/cio/device_ops.c +++ b/drivers/s390/cio/device_ops.c @@ -263,6 +263,9 @@ ccw_device_wake_up(struct ccw_device *cdev, unsigned long ip, struct irb *irb) /* Abuse intparm for error reporting. */ if (IS_ERR(irb)) cdev->private->intparm = -EIO; + else if (irb->scsw.cc == 1) + /* Retry for deferred condition code. */ + cdev->private->intparm = -EAGAIN; else if ((irb->scsw.dstat != (DEV_STAT_CHN_END|DEV_STAT_DEV_END)) || (irb->scsw.cstat != 0)) { From 65200c291c4ce397835d8232eaa0878b765a9bce Mon Sep 17 00:00:00 2001 From: Peter Oberparleiter Date: Mon, 7 Aug 2006 17:00:33 +0200 Subject: [PATCH 3/3] [S390] lost interrupt after chpid vary off/on cycle. I/O on a CCW device may stall if a channel path to that device is logicaly varied off/on. A user I/O interrupt can get misinterpreted as interrupt for an internal path verification operation due to a missing check and is therefore never reported to the device driver. Correct check for pending interruptions before starting path verification. Signed-off-by: Peter Oberparleiter Signed-off-by: Martin Schwidefsky --- drivers/s390/cio/device_fsm.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index 7a39e0b0386c..6d91c2eb205b 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c @@ -772,6 +772,7 @@ ccw_device_online_verify(struct ccw_device *cdev, enum dev_event dev_event) stsch(sch->schid, &sch->schib); if (sch->schib.scsw.actl != 0 || + (sch->schib.scsw.stctl & SCSW_STCTL_STATUS_PEND) || (cdev->private->irb.scsw.stctl & SCSW_STCTL_STATUS_PEND)) { /* * No final status yet or final status not yet delivered