diff options
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r-- | drivers/scsi/scsi_lib.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 0b33e4f1a51e..c3bb28c3feef 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -96,6 +96,8 @@ int scsi_insert_special_req(struct scsi_request *sreq, int at_head) | |||
96 | return 0; | 96 | return 0; |
97 | } | 97 | } |
98 | 98 | ||
99 | static void scsi_run_queue(struct request_queue *q); | ||
100 | |||
99 | /* | 101 | /* |
100 | * Function: scsi_queue_insert() | 102 | * Function: scsi_queue_insert() |
101 | * | 103 | * |
@@ -119,6 +121,8 @@ int scsi_queue_insert(struct scsi_cmnd *cmd, int reason) | |||
119 | { | 121 | { |
120 | struct Scsi_Host *host = cmd->device->host; | 122 | struct Scsi_Host *host = cmd->device->host; |
121 | struct scsi_device *device = cmd->device; | 123 | struct scsi_device *device = cmd->device; |
124 | struct request_queue *q = device->request_queue; | ||
125 | unsigned long flags; | ||
122 | 126 | ||
123 | SCSI_LOG_MLQUEUE(1, | 127 | SCSI_LOG_MLQUEUE(1, |
124 | printk("Inserting command %p into mlqueue\n", cmd)); | 128 | printk("Inserting command %p into mlqueue\n", cmd)); |
@@ -160,17 +164,22 @@ int scsi_queue_insert(struct scsi_cmnd *cmd, int reason) | |||
160 | scsi_device_unbusy(device); | 164 | scsi_device_unbusy(device); |
161 | 165 | ||
162 | /* | 166 | /* |
163 | * Insert this command at the head of the queue for it's device. | 167 | * Requeue this command. It will go before all other commands |
164 | * It will go before all other commands that are already in the queue. | 168 | * that are already in the queue. |
165 | * | 169 | * |
166 | * NOTE: there is magic here about the way the queue is plugged if | 170 | * NOTE: there is magic here about the way the queue is plugged if |
167 | * we have no outstanding commands. | 171 | * we have no outstanding commands. |
168 | * | 172 | * |
169 | * Although this *doesn't* plug the queue, it does call the request | 173 | * Although we *don't* plug the queue, we call the request |
170 | * function. The SCSI request function detects the blocked condition | 174 | * function. The SCSI request function detects the blocked condition |
171 | * and plugs the queue appropriately. | 175 | * and plugs the queue appropriately. |
172 | */ | 176 | */ |
173 | blk_insert_request(device->request_queue, cmd->request, 1, cmd, 1); | 177 | spin_lock_irqsave(q->queue_lock, flags); |
178 | blk_requeue_request(q, cmd->request); | ||
179 | spin_unlock_irqrestore(q->queue_lock, flags); | ||
180 | |||
181 | scsi_run_queue(q); | ||
182 | |||
174 | return 0; | 183 | return 0; |
175 | } | 184 | } |
176 | 185 | ||