diff options
author | Tejun Heo <htejun@gmail.com> | 2005-04-24 03:08:52 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.(none)> | 2005-05-20 13:53:30 -0400 |
commit | a1bf9d1d9272708922e83e465104106131f6415f (patch) | |
tree | b89ce430de2a2b2f454c1c89af586cdde13a480c /drivers/scsi/scsi_lib.c | |
parent | 283369ccc26705bd9585a0e533c92bd7364c28d1 (diff) |
[SCSI] make scsi_queue_insert() use blk_requeue_request()
scsi_queue_insert() used to use blk_insert_request() for requeueing
requests. This depends on the unobvious behavior of
blk_insert_request() setting REQ_SPECIAL and REQ_SOFTBARRIER when
requeueing. This patch makes scsi_queue_insert() use
blk_requeue_request(). As REQ_SPECIAL means special requests and
REQ_SOFTBARRIER is automatically handled by blk layer now, no flag
needs to be set.
Note that scsi_queue_insert() now calls scsi_run_queue() itself, and
the prototype of the function is added right above
scsi_queue_insert(). This is temporary, as later requeue path
consolidation patchset removes scsi_queue_insert(). By adding
temporary prototype, we can do away with unnecessarily moving
functions.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
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 | ||