[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>
此提交包含在:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
新增問題並參考
封鎖使用者