aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-01-13 17:01:46 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-01-13 17:01:46 -0500
commitc41d9663252e766e65cc06b82618c11ecf697acb (patch)
tree93677295bb186d73fbf8fefd4f4702b46924b393
parentff483d55ba6fb50a8d6f99e808da35218533b1ef (diff)
Revert "scsi: use device_remove_file_self() instead of device_schedule_callback()"
This reverts commit de1dee7820c44b1a5765265ed7ca8ee44f2367c1. Tejun writes: I'm sorry but can you please revert the whole series? get_active() waiting while a node is deactivated has potential to lead to deadlock and that deactivate/reactivate interface is something fundamentally flawed and that cgroup will have to work with the remove_self() like everybody else. IOW, I think the first posting was correct. Cc: Tejun Heo <tj@kernel.org> Cc: "James E.J. Bottomley" <JBottomley@parallels.com> Cc: linux-scsi@vger.kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/scsi/scsi_sysfs.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index 33e619921358..8ff62c26a41c 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -635,12 +635,23 @@ store_rescan_field (struct device *dev, struct device_attribute *attr,
635} 635}
636static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field); 636static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field);
637 637
638static void sdev_store_delete_callback(struct device *dev)
639{
640 scsi_remove_device(to_scsi_device(dev));
641}
642
638static ssize_t 643static ssize_t
639sdev_store_delete(struct device *dev, struct device_attribute *attr, 644sdev_store_delete(struct device *dev, struct device_attribute *attr,
640 const char *buf, size_t count) 645 const char *buf, size_t count)
641{ 646{
642 if (device_remove_file_self(dev, attr)) 647 int rc;
643 scsi_remove_device(to_scsi_device(dev)); 648
649 /* An attribute cannot be unregistered by one of its own methods,
650 * so we have to use this roundabout approach.
651 */
652 rc = device_schedule_callback(dev, sdev_store_delete_callback);
653 if (rc)
654 count = rc;
644 return count; 655 return count;
645}; 656};
646static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete); 657static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete);