aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/osd
diff options
context:
space:
mode:
authorBoaz Harrosh <bharrosh@panasas.com>2009-11-16 13:44:02 -0500
committerJames Bottomley <James.Bottomley@suse.de>2009-12-04 13:01:45 -0500
commit89f5e1f2f13b1079b8d7ff7d3ade345b7ad7c009 (patch)
treee2a6c1a93428c870561646558666e2a01d05a5fa /drivers/scsi/osd
parentc7d2dc2a204fa37bdf607d4d062dfd14e392aaf1 (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.c8
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}