s390/dasd: fix hanging offline processing
authorStefan Haberland <sth@linux.vnet.ibm.com>
Tue, 20 Sep 2016 08:29:22 +0000 (10:29 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 26 Sep 2016 14:45:27 +0000 (16:45 +0200)
Internal I/O is processed by the _sleep_on_function which might wait for a
device to get operational. During offline processing this will never happen
and therefore the refcount of the device will not drop to zero and the
offline processing blocks as well.

Fix by letting requests fail in the _sleep_on function during offline
processing. No further handling of the requests is necessary since this is
internal I/O and the device is thrown away afterwards.

Reviewed-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: Stefan Haberland <sth@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/block/dasd.c

index 5245d7e37a46bbbb5b03c28d59a85dfdfa861f4f..706ae0ac94c971bec9bde617503dd8e3d7ea28c7 100644 (file)
@@ -2277,6 +2277,15 @@ static int _dasd_sleep_on(struct dasd_ccw_req *maincqr, int interruptible)
                        cqr->intrc = -ENOLINK;
                        continue;
                }
+               /*
+                * Don't try to start requests if device is in
+                * offline processing, it might wait forever
+                */
+               if (test_bit(DASD_FLAG_OFFLINE, &device->flags)) {
+                       cqr->status = DASD_CQR_FAILED;
+                       cqr->intrc = -ENODEV;
+                       continue;
+               }
                /*
                 * Don't try to start requests if device is stopped
                 * except path verification requests