block: genhd: Add disk/partition specific uevent callbacks for partition info
authorSan Mehat <san@google.com>
Sat, 10 Oct 2009 16:35:24 +0000 (09:35 -0700)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 25 Nov 2015 12:04:41 +0000 (20:04 +0800)
For disk devices, a new uevent parameter 'NPARTS' specifies the number
of partitions detected by the kernel. Partition devices get 'PARTN' which
specifies the partitions index in the table, and 'PARTNAME', which
specifies PARTNAME specifices the partition name of a partition device

Signed-off-by: Dima Zavin <dima@android.com>
(cherry picked from commit 9b9ae694cce47e568fd8f7619c70f1fc91e5b81d)

Change-Id: I5cb7496c9dcd7659116f1b4d5577ac85be102fb5

block/genhd.c
block/partition-generic.c

index e5cafa51567c9d589147523c8ab7b43504f9d725..817c67c9e45e3966623b028f0d3d8722e4ebac1e 100644 (file)
@@ -1117,6 +1117,22 @@ static void disk_release(struct device *dev)
                blk_put_queue(disk->queue);
        kfree(disk);
 }
+
+static int disk_uevent(struct device *dev, struct kobj_uevent_env *env)
+{
+       struct gendisk *disk = dev_to_disk(dev);
+       struct disk_part_iter piter;
+       struct hd_struct *part;
+       int cnt = 0;
+
+       disk_part_iter_init(&piter, disk, 0);
+       while((part = disk_part_iter_next(&piter)))
+               cnt++;
+       disk_part_iter_exit(&piter);
+       add_uevent_var(env, "NPARTS=%u", cnt);
+       return 0;
+}
+
 struct class block_class = {
        .name           = "block",
 };
@@ -1136,6 +1152,7 @@ static struct device_type disk_type = {
        .groups         = disk_attr_groups,
        .release        = disk_release,
        .devnode        = block_devnode,
+       .uevent         = disk_uevent,
 };
 
 #ifdef CONFIG_PROC_FS
index 3b030157ec85c45faedd520b6993cd440254d763..d12489ea720982257e188957a67757cd632cac20 100644 (file)
@@ -216,10 +216,21 @@ static void part_release(struct device *dev)
        kfree(p);
 }
 
+static int part_uevent(struct device *dev, struct kobj_uevent_env *env)
+{
+       struct hd_struct *part = dev_to_part(dev);
+
+       add_uevent_var(env, "PARTN=%u", part->partno);
+       if (part->info && part->info->volname[0])
+               add_uevent_var(env, "PARTNAME=%s", part->info->volname);
+       return 0;
+}
+
 struct device_type part_type = {
        .name           = "partition",
        .groups         = part_attr_groups,
        .release        = part_release,
+       .uevent         = part_uevent,
 };
 
 static void delete_partition_rcu_cb(struct rcu_head *head)