summaryrefslogtreecommitdiff
path: root/drivers/s390/cio/ccwreq.c
diff options
context:
space:
mode:
authorPeter Oberparleiter <peter.oberparleiter@de.ibm.com>2009-12-07 14:51:40 +0300
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>2009-12-07 14:51:33 +0300
commitde1b04388f63cbddf91d9f6c50c29be7232881ca (patch)
tree2a2500ab1093bb77b81e84ae56ab3aae1501c52a /drivers/s390/cio/ccwreq.c
parent7a8ad1001c51bba0507ee08cb4323d8ddcb07c70 (diff)
downloadlinux-de1b04388f63cbddf91d9f6c50c29be7232881ca.tar.xz
[S390] cio: improve error recovery for internal I/Os
Improve error recovery for internal I/Os by repeating each I/O 256 times per path to cope with long-running non-permanent error conditions. Also retry each path twice to cope with link flapping, i.e. single paths becoming unavailable in the order in which they are tried. Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/cio/ccwreq.c')
-rw-r--r--drivers/s390/cio/ccwreq.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/s390/cio/ccwreq.c b/drivers/s390/cio/ccwreq.c
index a6e205a384b2..9509e3860934 100644
--- a/drivers/s390/cio/ccwreq.c
+++ b/drivers/s390/cio/ccwreq.c
@@ -82,7 +82,7 @@ static void ccwreq_do(struct ccw_device *cdev)
/* Perform start function. */
sch->lpm = 0xff;
memset(&cdev->private->irb, 0, sizeof(struct irb));
- rc = cio_start(sch, cp, req->mask);
+ rc = cio_start(sch, cp, (u8) req->mask);
if (rc == 0) {
/* I/O started successfully. */
ccw_device_set_timeout(cdev, req->timeout);
@@ -116,7 +116,8 @@ void ccw_request_start(struct ccw_device *cdev)
{
struct ccw_request *req = &cdev->private->req;
- req->mask = 0x80;
+ /* Try all paths twice to counter link flapping. */
+ req->mask = 0x8080;
req->retries = req->maxretries;
req->mask = lpm_adjust(req->mask, req->lpm);
req->drc = 0;
@@ -212,7 +213,7 @@ static void ccwreq_log_status(struct ccw_device *cdev, enum io_status status)
} __attribute__ ((packed)) data;
data.dev_id = cdev->private->dev_id;
data.retries = req->retries;
- data.lpm = req->mask;
+ data.lpm = (u8) req->mask;
data.status = (u8) status;
CIO_TRACE_EVENT(2, "reqstat");
CIO_HEX_EVENT(2, &data, sizeof(data));