From bb97def1fadb4ee41141a77d4eaadd5176e121c7 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Mon, 12 Dec 2005 11:25:04 -0800 Subject: [PATCH] --- yaml --- r: 15047 b: refs/heads/master c: 49d7bc64283970ee83d2c954d04ba00d04e5943d h: refs/heads/master i: 15045: 72932e5cd8055cbcc63b0d743ed49e72fbf7e0f3 15043: 2ae9370163989d91bd2e1834b4c8437276b0ce77 15039: 42303fc8d9abd0a082d937c36d0e2bf3b5c3a873 v: v3 --- [refs] | 2 +- trunk/drivers/scsi/scsi_lib.c | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 2f765a88b698..4893cefd3e70 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5036805be7b815eb18dcce489d974f3aee4f3841 +refs/heads/master: 49d7bc64283970ee83d2c954d04ba00d04e5943d diff --git a/trunk/drivers/scsi/scsi_lib.c b/trunk/drivers/scsi/scsi_lib.c index 4afef5cdcb17..ce9d73a292e2 100644 --- a/trunk/drivers/scsi/scsi_lib.c +++ b/trunk/drivers/scsi/scsi_lib.c @@ -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)