diff options
author | James Bottomley <James.Bottomley@steeleye.com> | 2005-09-09 13:40:23 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.(none)> | 2005-09-09 16:30:59 -0500 |
commit | 788ce43aa1ad7158f894b6bb3df8ba2f63794c20 (patch) | |
tree | 56b84ceff12e0296f782023563a7a612a34fa6d9 /drivers | |
parent | e91442b635be776ea205fba233bdd5bc74b62bc3 (diff) | |
download | linux-788ce43aa1ad7158f894b6bb3df8ba2f63794c20.tar.gz linux-788ce43aa1ad7158f894b6bb3df8ba2f63794c20.tar.bz2 linux-788ce43aa1ad7158f894b6bb3df8ba2f63794c20.zip |
[SCSI] SCSI core: fix leakage of scsi_cmnd's
Actually, just one problem and one cosmetic fix:
1) We need to dequeue for the loop and kill case (it seems easiest
simply to dequeue in the scsi_kill_request() routine)
2) There's no real need to drop the queue lock. __scsi_done() is lock
agnostic, so since there's no requirement, let's just leave it in to
avoid any locking issues.
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/scsi_lib.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 003f8cf47cf1..d8d984841534 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -1370,7 +1370,8 @@ static void scsi_kill_request(struct request *req, request_queue_t *q) { struct scsi_cmnd *cmd = req->special; - spin_unlock(q->queue_lock); + blkdev_dequeue_request(req); + if (unlikely(cmd == NULL)) { printk(KERN_CRIT "impossible request in %s.\n", __FUNCTION__); @@ -1381,7 +1382,6 @@ static void scsi_kill_request(struct request *req, request_queue_t *q) cmd->result = DID_NO_CONNECT << 16; atomic_inc(&cmd->device->iorequest_cnt); __scsi_done(cmd); - spin_lock(q->queue_lock); } /* @@ -1432,7 +1432,6 @@ static void scsi_request_fn(struct request_queue *q) if (unlikely(!scsi_device_online(sdev))) { printk(KERN_ERR "scsi%d (%d:%d): rejecting I/O to offline device\n", sdev->host->host_no, sdev->id, sdev->lun); - blkdev_dequeue_request(req); scsi_kill_request(req, q); continue; } |