dasd: fix unresponsive device during format
authorStefan Haberland <stefan.haberland@de.ibm.com>
Fri, 18 Jul 2014 12:22:41 +0000 (14:22 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 22 Jul 2014 07:26:22 +0000 (09:26 +0200)
If path events occur the formatting process stucks because path
events may flush format requests from the queue.

Kick the format process after path events are handled.

Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/block/dasd.c

index 5e8442c..9242d7c 100644 (file)
@@ -1675,8 +1675,11 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
        if (cqr->status == DASD_CQR_CLEAR_PENDING &&
            scsw_fctl(&irb->scsw) & SCSW_FCTL_CLEAR_FUNC) {
                cqr->status = DASD_CQR_CLEARED;
+               if (cqr->callback_data == DASD_SLEEPON_START_TAG)
+                       cqr->callback_data = DASD_SLEEPON_END_TAG;
                dasd_device_clear_timer(device);
                wake_up(&dasd_flush_wq);
+               wake_up(&generic_waitq);
                dasd_schedule_device_bh(device);
                return;
        }
@@ -2439,6 +2442,8 @@ int dasd_cancel_req(struct dasd_ccw_req *cqr)
        case DASD_CQR_QUEUED:
                /* request was not started - just set to cleared */
                cqr->status = DASD_CQR_CLEARED;
+               if (cqr->callback_data == DASD_SLEEPON_START_TAG)
+                       cqr->callback_data = DASD_SLEEPON_END_TAG;
                break;
        case DASD_CQR_IN_IO:
                /* request in IO - terminate IO and release again */
@@ -3512,6 +3517,10 @@ int dasd_generic_path_operational(struct dasd_device *device)
        dasd_schedule_device_bh(device);
        if (device->block)
                dasd_schedule_block_bh(device->block);
+
+       if (!device->stopped)
+               wake_up(&generic_waitq);
+
        return 1;
 }
 EXPORT_SYMBOL_GPL(dasd_generic_path_operational);