mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-31 06:14:39 +01:00
scsi: core: Release SCSI devices synchronously
All upstream scsi_device_put() calls happen from thread context. Hence
simplify scsi_device_put() by always calling the release function
synchronously. This commit prepares for constifying the SCSI host template
by removing an assignment that clears the module pointer in the SCSI host
template.
scsi_device_dev_release_usercontext() was introduced in 2006 via
commit 65110b2168 ("[SCSI] fix wrong context bugs in SCSI").
Cc: Christoph Hellwig <[email protected]>
Cc: Ming Lei <[email protected]>
Cc: Hannes Reinecke <[email protected]>
Cc: John Garry <[email protected]>
Cc: Mike Christie <[email protected]>
Cc: Krzysztof Kozlowski <[email protected]>
Signed-off-by: Bart Van Assche <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Martin K. Petersen <[email protected]>
This commit is contained in:
1 parent
195fae206e
commit
f93ed747e2
3 files changed
+4
-21
No files matched your search
@@ -588,6 +588,8 @@ void scsi_device_put(struct scsi_device *sdev)
|
||||
{
|
||||
struct module *mod = sdev->host->hostt->module;
|
||||
|
||||
might_sleep();
|
||||
|
||||
put_device(&sdev->sdev_gendev);
|
||||
module_put(mod);
|
||||
}
|
||||
|
||||
@@ -441,20 +441,15 @@ static void scsi_device_cls_release(struct device *class_dev)
|
||||
put_device(&sdev->sdev_gendev);
|
||||
}
|
||||
|
||||
static void scsi_device_dev_release_usercontext(struct work_struct *work)
|
||||
static void scsi_device_dev_release(struct device *dev)
|
||||
{
|
||||
struct scsi_device *sdev;
|
||||
struct scsi_device *sdev = to_scsi_device(dev);
|
||||
struct device *parent;
|
||||
struct list_head *this, *tmp;
|
||||
struct scsi_vpd *vpd_pg80 = NULL, *vpd_pg83 = NULL;
|
||||
struct scsi_vpd *vpd_pg0 = NULL, *vpd_pg89 = NULL;
|
||||
struct scsi_vpd *vpd_pgb0 = NULL, *vpd_pgb1 = NULL, *vpd_pgb2 = NULL;
|
||||
unsigned long flags;
|
||||
struct module *mod;
|
||||
|
||||
sdev = container_of(work, struct scsi_device, ew.work);
|
||||
|
||||
mod = sdev->host->hostt->module;
|
||||
|
||||
scsi_dh_release_device(sdev);
|
||||
|
||||
@@ -518,19 +513,6 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work)
|
||||
|
||||
if (parent)
|
||||
put_device(parent);
|
||||
module_put(mod);
|
||||
}
|
||||
|
||||
static void scsi_device_dev_release(struct device *dev)
|
||||
{
|
||||
struct scsi_device *sdp = to_scsi_device(dev);
|
||||
|
||||
/* Set module pointer as NULL in case of module unloading */
|
||||
if (!try_module_get(sdp->host->hostt->module))
|
||||
sdp->host->hostt->module = NULL;
|
||||
|
||||
execute_in_process_context(scsi_device_dev_release_usercontext,
|
||||
&sdp->ew);
|
||||
}
|
||||
|
||||
static struct class sdev_class = {
|
||||
|
||||
@@ -236,7 +236,6 @@ struct scsi_device {
|
||||
struct device sdev_gendev,
|
||||
sdev_dev;
|
||||
|
||||
struct execute_work ew; /* used to get process context on put */
|
||||
struct work_struct requeue_work;
|
||||
|
||||
struct scsi_device_handler *handler;
|
||||
|
||||
Reference in new issue
Block a user