Commit 89f5e1f2 authored by Boaz Harrosh's avatar Boaz Harrosh Committed by James Bottomley
Browse files

[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: default avatarBoaz Harrosh <bharrosh@panasas.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent c7d2dc2a
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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);
	}
}