Skip to content

Commit

Permalink
[SCSI] fix usb storage oops
Browse files Browse the repository at this point in the history
The problem is that scsi_run_queue is called from scsi_next_command()
after doing a scsi_put_command.  If the command was the only thing
holding the reference on the scsi_device then the resulting device put
will tear down the block queue.  Fix this by taking a reference to the
device and holding it around scsi_run_queue()

Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
  • Loading branch information
goggin, edward authored and James Bottomley committed Nov 8, 2005
1 parent 383f974 commit 34ea80e
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion drivers/scsi/scsi_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -542,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)
Expand Down

0 comments on commit 34ea80e

Please sign in to comment.