s390/qdio: propagate error when cancelling a ccw fails
authorJulian Wiedmann <jwi@linux.ibm.com>
Tue, 1 Jun 2021 06:20:09 +0000 (08:20 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Tue, 27 Jul 2021 07:39:18 +0000 (09:39 +0200)
If qdio_cancel_ccw() times out (or is interrupted) before the interrupt
for the {halt,clear} action arrives, report this back to the caller as
an error.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
drivers/s390/cio/qdio_main.c

index 167653037b52f0fe03c09c21bd254c4be2a1d86e..99f34bdb267bbe66514839e43f7b123450a96946 100644 (file)
@@ -893,6 +893,7 @@ static void qdio_shutdown_queues(struct qdio_irq *irq_ptr)
 static int qdio_cancel_ccw(struct qdio_irq *irq, int how)
 {
        struct ccw_device *cdev = irq->cdev;
+       long timeout;
        int rc;
 
        spin_lock_irq(get_ccwdev_lock(cdev));
@@ -909,12 +910,14 @@ static int qdio_cancel_ccw(struct qdio_irq *irq, int how)
                return rc;
        }
 
-       wait_event_interruptible_timeout(cdev->private->wait_q,
-                                        irq->state == QDIO_IRQ_STATE_INACTIVE ||
-                                        irq->state == QDIO_IRQ_STATE_ERR,
-                                        10 * HZ);
+       timeout = wait_event_interruptible_timeout(cdev->private->wait_q,
+                                                  irq->state == QDIO_IRQ_STATE_INACTIVE ||
+                                                  irq->state == QDIO_IRQ_STATE_ERR,
+                                                  10 * HZ);
+       if (timeout <= 0)
+               rc = (timeout == -ERESTARTSYS) ? -EINTR : -ETIME;
 
-       return 0;
+       return rc;
 }
 
 /**