block: add the events* attributes to disk_attrs
authorChristoph Hellwig <hch@lst.de>
Thu, 24 Jun 2021 07:38:43 +0000 (09:38 +0200)
committerJens Axboe <axboe@kernel.dk>
Thu, 24 Jun 2021 18:00:22 +0000 (12:00 -0600)
Add the events attributes to the disk_attrs array, which ensures they are
added by the driver core when the device is created rather than adding
them after the device has been added, which is racy versus uevents and
requires more boilerplate code.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Link: https://lore.kernel.org/r/20210624073843.251178-3-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk.h
block/disk-events.c
block/genhd.c

index f8d726429906286e27a9a1f81a98f7c21d69d71c..4fcd7a0323779d50796a0371d0b0373188184b0e 100644 (file)
@@ -364,5 +364,8 @@ void disk_alloc_events(struct gendisk *disk);
 void disk_add_events(struct gendisk *disk);
 void disk_del_events(struct gendisk *disk);
 void disk_release_events(struct gendisk *disk);
+extern struct device_attribute dev_attr_events;
+extern struct device_attribute dev_attr_events_async;
+extern struct device_attribute dev_attr_events_poll_msecs;
 
 #endif /* BLK_INTERNAL_H */
index 1bc5dcb75e4ec98e2f5e657f9d0d07774e843f79..a75931ff5da4e35ef14e1df668bef15651a8e82d 100644 (file)
@@ -368,18 +368,10 @@ static ssize_t disk_events_poll_msecs_store(struct device *dev,
        return count;
 }
 
-static const DEVICE_ATTR(events, 0444, disk_events_show, NULL);
-static const DEVICE_ATTR(events_async, 0444, disk_events_async_show, NULL);
-static const DEVICE_ATTR(events_poll_msecs, 0644,
-                        disk_events_poll_msecs_show,
-                        disk_events_poll_msecs_store);
-
-static const struct attribute *disk_events_attrs[] = {
-       &dev_attr_events.attr,
-       &dev_attr_events_async.attr,
-       &dev_attr_events_poll_msecs.attr,
-       NULL,
-};
+DEVICE_ATTR(events, 0444, disk_events_show, NULL);
+DEVICE_ATTR(events_async, 0444, disk_events_async_show, NULL);
+DEVICE_ATTR(events_poll_msecs, 0644, disk_events_poll_msecs_show,
+           disk_events_poll_msecs_store);
 
 /*
  * The default polling interval can be specified by the kernel
@@ -444,11 +436,6 @@ void disk_alloc_events(struct gendisk *disk)
 
 void disk_add_events(struct gendisk *disk)
 {
-       /* FIXME: error handling */
-       if (sysfs_create_files(&disk_to_dev(disk)->kobj, disk_events_attrs) < 0)
-               pr_warn("%s: failed to create sysfs files for events\n",
-                       disk->disk_name);
-
        if (!disk->ev)
                return;
 
@@ -472,8 +459,6 @@ void disk_del_events(struct gendisk *disk)
                list_del_init(&disk->ev->node);
                mutex_unlock(&disk_events_mutex);
        }
-
-       sysfs_remove_files(&disk_to_dev(disk)->kobj, disk_events_attrs);
 }
 
 void disk_release_events(struct gendisk *disk)
index 4f879deede9ad7c4aa341007a95b92e78dc70bae..79aa40b4c39c474d0ed237e00508abdc40b66420 100644 (file)
@@ -1022,6 +1022,9 @@ static struct attribute *disk_attrs[] = {
        &dev_attr_stat.attr,
        &dev_attr_inflight.attr,
        &dev_attr_badblocks.attr,
+       &dev_attr_events.attr,
+       &dev_attr_events_async.attr,
+       &dev_attr_events_poll_msecs.attr,
 #ifdef CONFIG_FAIL_MAKE_REQUEST
        &dev_attr_fail.attr,
 #endif