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--; |
