提交 89f5e1f2 编写于 作者: B Boaz Harrosh 提交者: James Bottomley

[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: NBoaz Harrosh <bharrosh@panasas.com>
Signed-off-by: NJames Bottomley <James.Bottomley@suse.de>
上级 c7d2dc2a
......@@ -224,7 +224,15 @@ void osduld_put_device(struct osd_dev *od)
BUG_ON(od->scsi_device != oud->od.scsi_device);
/* If scsi has released the device (logout), and exofs has last
* reference on oud it will be freed by above osd_uld_release
* within fput below. But this will oops in cdev_release which
* is called after the fops->release. __uld_get/put pair makes
* sure we have a cdev for the duration of fput
*/
__uld_get(oud);
fput(od->file);
__uld_put(oud);
kfree(od);
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册