diff options
author | James Bottomley <James.Bottomley@suse.de> | 2009-10-02 13:30:08 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-10-13 11:33:45 -0500 |
commit | 37e6ba00720c2786330dec2a9a5081e9e049422f (patch) | |
tree | 467ba2046d0d9ea9e855d2e40b9964a3412f99e1 /drivers/scsi/scsi_scan.c | |
parent | 2caa731819a633bec5a56736e64c562b7e193666 (diff) | |
download | linux-37e6ba00720c2786330dec2a9a5081e9e049422f.tar.gz linux-37e6ba00720c2786330dec2a9a5081e9e049422f.tar.bz2 linux-37e6ba00720c2786330dec2a9a5081e9e049422f.zip |
[SCSI] fix memory leak in initialization
The root cause of the problem is the fact that dev_set_name() now
allocates storage instead of using the original array within the kobj.
That means that the SCSI assumption that if you haven't made the
containing object or any sub objects visible, you can just destroy it
(and its component devices) lock stock and barrel becomes false.
Fix this by doing the get of sdev_dev at parent time and thus do an
extra put of it in scsi_destroy_sdev() (and all other destruction
without add paths).
Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/scsi_scan.c')
-rw-r--r-- | drivers/scsi/scsi_scan.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index c44783801402..0547a7f44d42 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -317,6 +317,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, out_device_destroy: scsi_device_set_state(sdev, SDEV_DEL); transport_destroy_device(&sdev->sdev_gendev); + put_device(&sdev->sdev_dev); put_device(&sdev->sdev_gendev); out: if (display_failure_msg) @@ -957,6 +958,7 @@ static inline void scsi_destroy_sdev(struct scsi_device *sdev) if (sdev->host->hostt->slave_destroy) sdev->host->hostt->slave_destroy(sdev); transport_destroy_device(&sdev->sdev_gendev); + put_device(&sdev->sdev_dev); put_device(&sdev->sdev_gendev); } |