diff options
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r-- | drivers/scsi/scsi_lib.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index e9901b8f8443..01e4e51c4b68 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -74,8 +74,6 @@ struct kmem_cache *scsi_sdb_cache; | |||
74 | */ | 74 | */ |
75 | #define SCSI_QUEUE_DELAY 3 | 75 | #define SCSI_QUEUE_DELAY 3 |
76 | 76 | ||
77 | static void scsi_run_queue(struct request_queue *q); | ||
78 | |||
79 | /* | 77 | /* |
80 | * Function: scsi_unprep_request() | 78 | * Function: scsi_unprep_request() |
81 | * | 79 | * |
@@ -161,7 +159,7 @@ static int __scsi_queue_insert(struct scsi_cmnd *cmd, int reason, int unbusy) | |||
161 | blk_requeue_request(q, cmd->request); | 159 | blk_requeue_request(q, cmd->request); |
162 | spin_unlock_irqrestore(q->queue_lock, flags); | 160 | spin_unlock_irqrestore(q->queue_lock, flags); |
163 | 161 | ||
164 | scsi_run_queue(q); | 162 | kblockd_schedule_work(q, &device->requeue_work); |
165 | 163 | ||
166 | return 0; | 164 | return 0; |
167 | } | 165 | } |
@@ -433,7 +431,11 @@ static void scsi_run_queue(struct request_queue *q) | |||
433 | continue; | 431 | continue; |
434 | } | 432 | } |
435 | 433 | ||
436 | blk_run_queue_async(sdev->request_queue); | 434 | spin_unlock(shost->host_lock); |
435 | spin_lock(sdev->request_queue->queue_lock); | ||
436 | __blk_run_queue(sdev->request_queue); | ||
437 | spin_unlock(sdev->request_queue->queue_lock); | ||
438 | spin_lock(shost->host_lock); | ||
437 | } | 439 | } |
438 | /* put any unprocessed entries back */ | 440 | /* put any unprocessed entries back */ |
439 | list_splice(&starved_list, &shost->starved_list); | 441 | list_splice(&starved_list, &shost->starved_list); |
@@ -442,6 +444,16 @@ static void scsi_run_queue(struct request_queue *q) | |||
442 | blk_run_queue(q); | 444 | blk_run_queue(q); |
443 | } | 445 | } |
444 | 446 | ||
447 | void scsi_requeue_run_queue(struct work_struct *work) | ||
448 | { | ||
449 | struct scsi_device *sdev; | ||
450 | struct request_queue *q; | ||
451 | |||
452 | sdev = container_of(work, struct scsi_device, requeue_work); | ||
453 | q = sdev->request_queue; | ||
454 | scsi_run_queue(q); | ||
455 | } | ||
456 | |||
445 | /* | 457 | /* |
446 | * Function: scsi_requeue_command() | 458 | * Function: scsi_requeue_command() |
447 | * | 459 | * |