aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/block/dasd.c
diff options
context:
space:
mode:
authorStefan Haberland <stefan.haberland@de.ibm.com>2014-11-24 10:53:19 +0100
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2014-11-28 09:47:29 +0100
commit2c17124bf33f0d9450375610ff79ad83531b5bfe (patch)
tree5810104fc4c8b96a7d28b2541984e2c585358751 /drivers/s390/block/dasd.c
parent590aeeddc6c6d9b9c93bec56fc68512631489d2a (diff)
downloadlinux-2c17124bf33f0d9450375610ff79ad83531b5bfe.tar.gz
s390/dasd: fix infinite term I/O loop
During device activation all paths could be lost and since the device is not active it has no indication of this fact - hence the CQR will time-out. The following cancelation might fail with -EINVAL because CIO took over control and started path verification. In this case mark the CQR as being CLEARED since it could not be running any more. Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/block/dasd.c')
-rw-r--r--drivers/s390/block/dasd.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index 3679aeca1c1a0..8cb120e9c8681 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -1377,6 +1377,20 @@ int dasd_term_IO(struct dasd_ccw_req *cqr)
"I/O error, retry");
break;
case -EINVAL:
+ /*
+ * device not valid so no I/O could be running
+ * handle CQR as termination successful
+ */
+ cqr->status = DASD_CQR_CLEARED;
+ cqr->stopclk = get_tod_clock();
+ cqr->starttime = 0;
+ /* no retries for invalid devices */
+ cqr->retries = -1;
+ DBF_DEV_EVENT(DBF_ERR, device, "%s",
+ "EINVAL, handle as terminated");
+ /* fake rc to success */
+ rc = 0;
+ break;
case -EBUSY:
DBF_DEV_EVENT(DBF_ERR, device, "%s",
"device busy, retry later");