diff --git a/scst/include/scst.h b/scst/include/scst.h index 9f10f9fa7..c689a3391 100644 --- a/scst/include/scst.h +++ b/scst/include/scst.h @@ -2523,14 +2523,6 @@ struct scst_device { /* Set, if a strictly serialized cmd is waiting blocked */ unsigned int strictly_serialized_cmd_waiting:1; - /* - * Set, if this device is being unregistered. Useful to let sysfs - * attributes know when they should exit immediately to prevent - * possible deadlocks with their device unregistration waiting for - * their kobj last put. - */ - unsigned int dev_unregistering:1; - /**************************************************************/ /************************************************************* diff --git a/scst/src/dev_handlers/scst_vdisk.c b/scst/src/dev_handlers/scst_vdisk.c index 898fefa2e..ccf79030e 100644 --- a/scst/src/dev_handlers/scst_vdisk.c +++ b/scst/src/dev_handlers/scst_vdisk.c @@ -7426,6 +7426,17 @@ static ssize_t vdisk_sysfs_rotational_show(struct kobject *kobj, return pos; } +static bool scst_dev_being_unregistered(struct scst_device *dev) +{ + bool res; + + mutex_lock(&scst_mutex); + res = list_empty(&dev->dev_list_entry); + mutex_unlock(&scst_mutex); + + return res; +} + static int vdev_sysfs_process_get_filename(struct scst_sysfs_work_item *work) { int res = 0; @@ -7443,7 +7454,7 @@ static int vdev_sysfs_process_get_filename(struct scst_sysfs_work_item *work) * under scst_vdisk_mutex. */ while (!mutex_trylock(&scst_vdisk_mutex)) { - if (dev->dev_unregistering) { + if (scst_dev_being_unregistered(dev)) { TRACE_MGMT_DBG("Skipping being unregistered dev %s", dev->virt_name); res = -ENOENT; @@ -7454,18 +7465,6 @@ static int vdev_sysfs_process_get_filename(struct scst_sysfs_work_item *work) goto out_put; } msleep(100); - /* - * We need to reread dev_unregistering from memory, hence - * prevent compiler from putting it in a register. Generally, - * it shouldn't happen, because the compiler isn't allowed to do - * such a transformation if any functions that can cause side - * effects are called between successive accesses, but let's be - * on the safe side. We can't cast dev_unregistering to - * volatile, because it has no effect we need, and can't cast - * it to *(volatile bool*)&, because it isn't possible to get - * address of a bit field. - */ - barrier(); } virt_dev = dev->dh_priv; diff --git a/scst/src/scst_main.c b/scst/src/scst_main.c index 05a5d87e1..efb5ce3d6 100644 --- a/scst/src/scst_main.c +++ b/scst/src/scst_main.c @@ -1266,8 +1266,6 @@ static void scst_unregister_device(struct scsi_device *scsidp) goto out_unlock; } - dev->dev_unregistering = 1; - list_del_init(&dev->dev_list_entry); scst_dg_dev_remove_by_dev(dev); @@ -1531,8 +1529,6 @@ void scst_unregister_virtual_device(int id) goto out_unlock; } - dev->dev_unregistering = 1; - list_del_init(&dev->dev_list_entry); scst_pr_clear_dev(dev);