diff options
author | Boaz Harrosh <bharrosh@panasas.com> | 2009-11-16 13:44:02 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-12-04 13:01:45 -0500 |
commit | 89f5e1f2f13b1079b8d7ff7d3ade345b7ad7c009 (patch) | |
tree | e2a6c1a93428c870561646558666e2a01d05a5fa /drivers/scsi/osd | |
parent | c7d2dc2a204fa37bdf607d4d062dfd14e392aaf1 (diff) |
[SCSI] osduld: Ref-counting bug fix
If scsi has released the device (logout), and exofs has last
reference on the osduld_device it will be freed by
osd_uld_release() within the call to fput(). But this will
oops in cdev_release() which is called after the fops->release.
(cdev is embedded within osduld_device). __uld_get/put pair
makes sure we have a cdev for the duration of fput()
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/osd')
-rw-r--r-- | drivers/scsi/osd/osd_uld.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/scsi/osd/osd_uld.c b/drivers/scsi/osd/osd_uld.c index 0bdef3390902..1ea6447f9418 100644 --- a/drivers/scsi/osd/osd_uld.c +++ b/drivers/scsi/osd/osd_uld.c | |||
@@ -224,7 +224,15 @@ void osduld_put_device(struct osd_dev *od) | |||
224 | 224 | ||
225 | BUG_ON(od->scsi_device != oud->od.scsi_device); | 225 | BUG_ON(od->scsi_device != oud->od.scsi_device); |
226 | 226 | ||
227 | /* If scsi has released the device (logout), and exofs has last | ||
228 | * reference on oud it will be freed by above osd_uld_release | ||
229 | * within fput below. But this will oops in cdev_release which | ||
230 | * is called after the fops->release. __uld_get/put pair makes | ||
231 | * sure we have a cdev for the duration of fput | ||
232 | */ | ||
233 | __uld_get(oud); | ||
227 | fput(od->file); | 234 | fput(od->file); |
235 | __uld_put(oud); | ||
228 | kfree(od); | 236 | kfree(od); |
229 | } | 237 | } |
230 | } | 238 | } |