aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorStefan Haberland <stefan.haberland@de.ibm.com>2014-07-18 08:22:41 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2014-07-22 03:26:22 -0400
commit931a3dce819d2dedc731011c6fd7e6bb5aa188ef (patch)
treebe3149828417c9923b271cfbe5b94719d601615d /drivers/s390
parentdaa991bf30cbea85dc10560e6932406677ed5d5c (diff)
dasd: fix unresponsive device during format
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>
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/block/dasd.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index 5e8442c88e29..9242d7cff9b5 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -1675,8 +1675,11 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
1675 if (cqr->status == DASD_CQR_CLEAR_PENDING && 1675 if (cqr->status == DASD_CQR_CLEAR_PENDING &&
1676 scsw_fctl(&irb->scsw) & SCSW_FCTL_CLEAR_FUNC) { 1676 scsw_fctl(&irb->scsw) & SCSW_FCTL_CLEAR_FUNC) {
1677 cqr->status = DASD_CQR_CLEARED; 1677 cqr->status = DASD_CQR_CLEARED;
1678 if (cqr->callback_data == DASD_SLEEPON_START_TAG)
1679 cqr->callback_data = DASD_SLEEPON_END_TAG;
1678 dasd_device_clear_timer(device); 1680 dasd_device_clear_timer(device);
1679 wake_up(&dasd_flush_wq); 1681 wake_up(&dasd_flush_wq);
1682 wake_up(&generic_waitq);
1680 dasd_schedule_device_bh(device); 1683 dasd_schedule_device_bh(device);
1681 return; 1684 return;
1682 } 1685 }
@@ -2439,6 +2442,8 @@ int dasd_cancel_req(struct dasd_ccw_req *cqr)
2439 case DASD_CQR_QUEUED: 2442 case DASD_CQR_QUEUED:
2440 /* request was not started - just set to cleared */ 2443 /* request was not started - just set to cleared */
2441 cqr->status = DASD_CQR_CLEARED; 2444 cqr->status = DASD_CQR_CLEARED;
2445 if (cqr->callback_data == DASD_SLEEPON_START_TAG)
2446 cqr->callback_data = DASD_SLEEPON_END_TAG;
2442 break; 2447 break;
2443 case DASD_CQR_IN_IO: 2448 case DASD_CQR_IN_IO:
2444 /* request in IO - terminate IO and release again */ 2449 /* request in IO - terminate IO and release again */
@@ -3512,6 +3517,10 @@ int dasd_generic_path_operational(struct dasd_device *device)
3512 dasd_schedule_device_bh(device); 3517 dasd_schedule_device_bh(device);
3513 if (device->block) 3518 if (device->block)
3514 dasd_schedule_block_bh(device->block); 3519 dasd_schedule_block_bh(device->block);
3520
3521 if (!device->stopped)
3522 wake_up(&generic_waitq);
3523
3515 return 1; 3524 return 1;
3516} 3525}
3517EXPORT_SYMBOL_GPL(dasd_generic_path_operational); 3526EXPORT_SYMBOL_GPL(dasd_generic_path_operational);