aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);