From 2c1893210e9742ac84b1fdba20e280f38dd388bb Mon Sep 17 00:00:00 2001 From: Wei Fang Date: Mon, 18 Feb 2019 16:04:06 +0800 Subject: [PATCH] scsi: fix failing unload of a LLDD module euler inclusion category: bugfix bugzilla: 8990 CVE: NA --------------------------- This reverts part of commit cff549e4860f ("scsi: proper state checking and module refcount handling in scsi_device_get"). scsi_device_get() will fail in a module exit route, thus device can't be removed. Turn try_module_get() into __module_get() to make sure scsi device will be removed normally. Signed-off-by: Wei Fang Signed-off-by: Hanjun Guo [yan: cherry-picked from kernel-4.1 f94b5b901110] Signed-off-by: Jason Yan Reviewed-by: zhengbin Signed-off-by: Yang Yingliang --- drivers/scsi/scsi.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index fc1356d101b0..7d472c22c7d2 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -544,9 +544,6 @@ EXPORT_SYMBOL(scsi_report_opcode); * Description: Gets a reference to the scsi_device and increments the use count * of the underlying LLDD module. You must hold host_lock of the * parent Scsi_Host or already have a reference when calling this. - * - * This will fail if a device is deleted or cancelled, or when the LLD module - * is in the process of being unloaded. */ int scsi_device_get(struct scsi_device *sdev) { @@ -554,12 +551,12 @@ int scsi_device_get(struct scsi_device *sdev) goto fail; if (!get_device(&sdev->sdev_gendev)) goto fail; - if (!try_module_get(sdev->host->hostt->module)) - goto fail_put_device; + /* We can fail try_module_get if we're doing SCSI operations + * from module exit (like cache flush) + */ + __module_get(sdev->host->hostt->module); return 0; -fail_put_device: - put_device(&sdev->sdev_gendev); fail: return -ENXIO; } -- GitLab