diff options
Diffstat (limited to 'fs/partitions/check.c')
-rw-r--r-- | fs/partitions/check.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 79fbf3f390f0..6ffb1ac7de0c 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -38,6 +38,7 @@ #include "efi.h" #include "karma.h" #include "sysv68.h" +#include "cmdline.h" #ifdef CONFIG_BLK_DEV_MD extern void md_autodetect_dev(dev_t dev); @@ -46,6 +47,9 @@ extern void md_autodetect_dev(dev_t dev); int warn_no_part = 1; /*This is ugly: should make genhd removable media aware*/ static int (*check_part[])(struct parsed_partitions *) = { +#ifdef CONFIG_CMDLINE_PARTITION + cmdline_partition, +#endif /* * Probe partition formats with tables at disk address 0 * that also have an ADFS boot block at 0xdc0. @@ -286,6 +290,13 @@ ssize_t part_inflight_show(struct device *dev, return sprintf(buf, "%8u %8u\n", p->in_flight[0], p->in_flight[1]); } +ssize_t part_partition_name_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct hd_struct *p = dev_to_part(dev); + return sprintf(buf, "%s\n", p->partition_name); +} + #ifdef CONFIG_FAIL_MAKE_REQUEST ssize_t part_fail_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -317,6 +328,8 @@ static DEVICE_ATTR(discard_alignment, S_IRUGO, part_discard_alignment_show, NULL); static DEVICE_ATTR(stat, S_IRUGO, part_stat_show, NULL); static DEVICE_ATTR(inflight, S_IRUGO, part_inflight_show, NULL); +static DEVICE_ATTR(partition_name, S_IRUGO, part_partition_name_show, NULL); + #ifdef CONFIG_FAIL_MAKE_REQUEST static struct device_attribute dev_attr_fail = __ATTR(make-it-fail, S_IRUGO|S_IWUSR, part_fail_show, part_fail_store); @@ -330,6 +343,7 @@ static struct attribute *part_attrs[] = { &dev_attr_discard_alignment.attr, &dev_attr_stat.attr, &dev_attr_inflight.attr, + &dev_attr_partition_name.attr, #ifdef CONFIG_FAIL_MAKE_REQUEST &dev_attr_fail.attr, #endif @@ -355,10 +369,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->partition_name) + add_uevent_var(env, "PARTNAME=%s", part->partition_name); + 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) @@ -400,6 +425,11 @@ static ssize_t whole_disk_show(struct device *dev, static DEVICE_ATTR(whole_disk, S_IRUSR | S_IRGRP | S_IROTH, whole_disk_show, NULL); +static void name_partition(struct hd_struct *p, const char *name) +{ + strlcpy(p->partition_name, name, GENHD_PART_NAME_SIZE); +} + struct hd_struct *add_partition(struct gendisk *disk, int partno, sector_t start, sector_t len, int flags) { @@ -682,6 +712,7 @@ rescan: disk->disk_name, p, -PTR_ERR(part)); continue; } + name_partition(part, state->parts[p].name); #ifdef CONFIG_BLK_DEV_MD if (state->parts[p].flags & ADDPART_FLAG_RAID) md_autodetect_dev(part_to_dev(part)->devt); |