|
@@ -35,6 +35,7 @@ static DEFINE_IDR(ext_devt_idr);
|
|
|
|
|
|
static struct device_type disk_type;
|
|
|
|
|
|
+static void disk_alloc_events(struct gendisk *disk);
|
|
|
static void disk_add_events(struct gendisk *disk);
|
|
|
static void disk_del_events(struct gendisk *disk);
|
|
|
static void disk_release_events(struct gendisk *disk);
|
|
@@ -601,6 +602,8 @@ void add_disk(struct gendisk *disk)
|
|
|
disk->major = MAJOR(devt);
|
|
|
disk->first_minor = MINOR(devt);
|
|
|
|
|
|
+ disk_alloc_events(disk);
|
|
|
+
|
|
|
/* Register BDI before referencing it from bdev */
|
|
|
bdi = &disk->queue->backing_dev_info;
|
|
|
bdi_register_dev(bdi, disk_devt(disk));
|
|
@@ -1733,9 +1736,9 @@ module_param_cb(events_dfl_poll_msecs, &disk_events_dfl_poll_msecs_param_ops,
|
|
|
&disk_events_dfl_poll_msecs, 0644);
|
|
|
|
|
|
/*
|
|
|
- * disk_{add|del|release}_events - initialize and destroy disk_events.
|
|
|
+ * disk_{alloc|add|del|release}_events - initialize and destroy disk_events.
|
|
|
*/
|
|
|
-static void disk_add_events(struct gendisk *disk)
|
|
|
+static void disk_alloc_events(struct gendisk *disk)
|
|
|
{
|
|
|
struct disk_events *ev;
|
|
|
|
|
@@ -1748,16 +1751,6 @@ static void disk_add_events(struct gendisk *disk)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- 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);
|
|
|
- kfree(ev);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- disk->ev = ev;
|
|
|
-
|
|
|
INIT_LIST_HEAD(&ev->node);
|
|
|
ev->disk = disk;
|
|
|
spin_lock_init(&ev->lock);
|
|
@@ -1766,8 +1759,21 @@ static void disk_add_events(struct gendisk *disk)
|
|
|
ev->poll_msecs = -1;
|
|
|
INIT_DELAYED_WORK(&ev->dwork, disk_events_workfn);
|
|
|
|
|
|
+ disk->ev = ev;
|
|
|
+}
|
|
|
+
|
|
|
+static void disk_add_events(struct gendisk *disk)
|
|
|
+{
|
|
|
+ if (!disk->ev)
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* 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);
|
|
|
+
|
|
|
mutex_lock(&disk_events_mutex);
|
|
|
- list_add_tail(&ev->node, &disk_events);
|
|
|
+ list_add_tail(&disk->ev->node, &disk_events);
|
|
|
mutex_unlock(&disk_events_mutex);
|
|
|
|
|
|
/*
|