]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/scsi_lib.c
Merge master.kernel.org:/home/rmk/linux-2.6-drvmodel
[linux-2.6-omap-h63xx.git] / drivers / scsi / scsi_lib.c
index e40c8b66da40fe80ab6a1167ed29b1e9e62fa3d9..ce9d73a292e2a0f273992efd56e7cb7370f2bbc0 100644 (file)
@@ -254,55 +254,6 @@ void scsi_do_req(struct scsi_request *sreq, const void *cmnd,
 }
 EXPORT_SYMBOL(scsi_do_req);
 
-/* This is the end routine we get to if a command was never attached
- * to the request.  Simply complete the request without changing
- * rq_status; this will cause a DRIVER_ERROR. */
-static void scsi_wait_req_end_io(struct request *req)
-{
-       BUG_ON(!req->waiting);
-
-       complete(req->waiting);
-}
-
-void scsi_wait_req(struct scsi_request *sreq, const void *cmnd, void *buffer,
-                  unsigned bufflen, int timeout, int retries)
-{
-       DECLARE_COMPLETION(wait);
-       int write = (sreq->sr_data_direction == DMA_TO_DEVICE);
-       struct request *req;
-
-       req = blk_get_request(sreq->sr_device->request_queue, write,
-                             __GFP_WAIT);
-       if (bufflen && blk_rq_map_kern(sreq->sr_device->request_queue, req,
-                                      buffer, bufflen, __GFP_WAIT)) {
-               sreq->sr_result = DRIVER_ERROR << 24;
-               blk_put_request(req);
-               return;
-       }
-
-       req->flags |= REQ_NOMERGE;
-       req->waiting = &wait;
-       req->end_io = scsi_wait_req_end_io;
-       req->cmd_len = COMMAND_SIZE(((u8 *)cmnd)[0]);
-       req->sense = sreq->sr_sense_buffer;
-       req->sense_len = 0;
-       memcpy(req->cmd, cmnd, req->cmd_len);
-       req->timeout = timeout;
-       req->flags |= REQ_BLOCK_PC;
-       req->rq_disk = NULL;
-       blk_insert_request(sreq->sr_device->request_queue, req,
-                          sreq->sr_data_direction == DMA_TO_DEVICE, NULL);
-       wait_for_completion(&wait);
-       sreq->sr_request->waiting = NULL;
-       sreq->sr_result = req->errors;
-       if (req->errors)
-               sreq->sr_result |= (DRIVER_ERROR << 24);
-
-       blk_put_request(req);
-}
-
-EXPORT_SYMBOL(scsi_wait_req);
-
 /**
  * scsi_execute - insert request and wait for the result
  * @sdev:      scsi device
@@ -591,10 +542,17 @@ static void scsi_requeue_command(struct request_queue *q, struct scsi_cmnd *cmd)
 
 void scsi_next_command(struct scsi_cmnd *cmd)
 {
-       struct request_queue *q = cmd->device->request_queue;
+       struct scsi_device *sdev = cmd->device;
+       struct request_queue *q = sdev->request_queue;
+
+       /* need to hold a reference on the device before we let go of the cmd */
+       get_device(&sdev->sdev_gendev);
 
        scsi_put_command(cmd);
        scsi_run_queue(q);
+
+       /* ok to remove device now */
+       put_device(&sdev->sdev_gendev);
 }
 
 void scsi_run_host_queues(struct Scsi_Host *shost)