diff options
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r-- | drivers/scsi/scsi_lib.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 863bb6495daa..dc9c772bc874 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -118,7 +118,6 @@ static void scsi_unprep_request(struct request *req) | |||
118 | req->flags &= ~REQ_DONTPREP; | 118 | req->flags &= ~REQ_DONTPREP; |
119 | req->special = (req->flags & REQ_SPECIAL) ? cmd->sc_request : NULL; | 119 | req->special = (req->flags & REQ_SPECIAL) ? cmd->sc_request : NULL; |
120 | 120 | ||
121 | scsi_release_buffers(cmd); | ||
122 | scsi_put_command(cmd); | 121 | scsi_put_command(cmd); |
123 | } | 122 | } |
124 | 123 | ||
@@ -140,14 +139,12 @@ static void scsi_unprep_request(struct request *req) | |||
140 | * commands. | 139 | * commands. |
141 | * Notes: This could be called either from an interrupt context or a | 140 | * Notes: This could be called either from an interrupt context or a |
142 | * normal process context. | 141 | * normal process context. |
143 | * Notes: Upon return, cmd is a stale pointer. | ||
144 | */ | 142 | */ |
145 | int scsi_queue_insert(struct scsi_cmnd *cmd, int reason) | 143 | int scsi_queue_insert(struct scsi_cmnd *cmd, int reason) |
146 | { | 144 | { |
147 | struct Scsi_Host *host = cmd->device->host; | 145 | struct Scsi_Host *host = cmd->device->host; |
148 | struct scsi_device *device = cmd->device; | 146 | struct scsi_device *device = cmd->device; |
149 | struct request_queue *q = device->request_queue; | 147 | struct request_queue *q = device->request_queue; |
150 | struct request *req = cmd->request; | ||
151 | unsigned long flags; | 148 | unsigned long flags; |
152 | 149 | ||
153 | SCSI_LOG_MLQUEUE(1, | 150 | SCSI_LOG_MLQUEUE(1, |
@@ -188,9 +185,8 @@ int scsi_queue_insert(struct scsi_cmnd *cmd, int reason) | |||
188 | * function. The SCSI request function detects the blocked condition | 185 | * function. The SCSI request function detects the blocked condition |
189 | * and plugs the queue appropriately. | 186 | * and plugs the queue appropriately. |
190 | */ | 187 | */ |
191 | scsi_unprep_request(req); | ||
192 | spin_lock_irqsave(q->queue_lock, flags); | 188 | spin_lock_irqsave(q->queue_lock, flags); |
193 | blk_requeue_request(q, req); | 189 | blk_requeue_request(q, cmd->request); |
194 | spin_unlock_irqrestore(q->queue_lock, flags); | 190 | spin_unlock_irqrestore(q->queue_lock, flags); |
195 | 191 | ||
196 | scsi_run_queue(q); | 192 | scsi_run_queue(q); |
@@ -451,7 +447,7 @@ void scsi_device_unbusy(struct scsi_device *sdev) | |||
451 | 447 | ||
452 | spin_lock_irqsave(shost->host_lock, flags); | 448 | spin_lock_irqsave(shost->host_lock, flags); |
453 | shost->host_busy--; | 449 | shost->host_busy--; |
454 | if (unlikely((shost->shost_state == SHOST_RECOVERY) && | 450 | if (unlikely(scsi_host_in_recovery(shost) && |
455 | shost->host_failed)) | 451 | shost->host_failed)) |
456 | scsi_eh_wakeup(shost); | 452 | scsi_eh_wakeup(shost); |
457 | spin_unlock(shost->host_lock); | 453 | spin_unlock(shost->host_lock); |
@@ -1268,6 +1264,7 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req) | |||
1268 | } | 1264 | } |
1269 | } else { | 1265 | } else { |
1270 | memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd)); | 1266 | memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd)); |
1267 | cmd->cmd_len = req->cmd_len; | ||
1271 | if (rq_data_dir(req) == WRITE) | 1268 | if (rq_data_dir(req) == WRITE) |
1272 | cmd->sc_data_direction = DMA_TO_DEVICE; | 1269 | cmd->sc_data_direction = DMA_TO_DEVICE; |
1273 | else if (req->data_len) | 1270 | else if (req->data_len) |
@@ -1342,7 +1339,7 @@ static inline int scsi_host_queue_ready(struct request_queue *q, | |||
1342 | struct Scsi_Host *shost, | 1339 | struct Scsi_Host *shost, |
1343 | struct scsi_device *sdev) | 1340 | struct scsi_device *sdev) |
1344 | { | 1341 | { |
1345 | if (shost->shost_state == SHOST_RECOVERY) | 1342 | if (scsi_host_in_recovery(shost)) |
1346 | return 0; | 1343 | return 0; |
1347 | if (shost->host_busy == 0 && shost->host_blocked) { | 1344 | if (shost->host_busy == 0 && shost->host_blocked) { |
1348 | /* | 1345 | /* |
@@ -1514,7 +1511,6 @@ static void scsi_request_fn(struct request_queue *q) | |||
1514 | * cases (host limits or settings) should run the queue at some | 1511 | * cases (host limits or settings) should run the queue at some |
1515 | * later time. | 1512 | * later time. |
1516 | */ | 1513 | */ |
1517 | scsi_unprep_request(req); | ||
1518 | spin_lock_irq(q->queue_lock); | 1514 | spin_lock_irq(q->queue_lock); |
1519 | blk_requeue_request(q, req); | 1515 | blk_requeue_request(q, req); |
1520 | sdev->device_busy--; | 1516 | sdev->device_busy--; |