diff options
author | Stephen Warren <swarren@nvidia.com> | 2012-11-08 19:12:28 -0500 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2012-11-23 08:28:58 -0500 |
commit | d33b98fc82b0908e91fb05ae081acaed7323f9d2 (patch) | |
tree | fe5803ac8510ab46f0fcbcc1712343806699a5cb /block/partitions | |
parent | 283f8fc03927b0ef42a2faa60a0df5ec8c612edb (diff) |
block: partition: msdos: provide UUIDs for partitions
The MSDOS/MBR partition table includes a 32-bit unique ID, often referred
to as the NT disk signature. When combined with a partition number within
the table, this can form a unique ID similar in concept to EFI/GPT's
partition UUID. Constructing and recording this value in struct
partition_meta_info allows MSDOS partitions to be referred to on the
kernel command-line using the following syntax:
root=PARTUUID=0002dd75-01
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Will Drewry <wad@chromium.org>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/partitions')
-rw-r--r-- | block/partitions/msdos.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/block/partitions/msdos.c b/block/partitions/msdos.c index 5f79a6677c69..8752a5d26565 100644 --- a/block/partitions/msdos.c +++ b/block/partitions/msdos.c | |||
@@ -94,6 +94,17 @@ static int aix_magic_present(struct parsed_partitions *state, unsigned char *p) | |||
94 | return ret; | 94 | return ret; |
95 | } | 95 | } |
96 | 96 | ||
97 | static void set_info(struct parsed_partitions *state, int slot, | ||
98 | u32 disksig) | ||
99 | { | ||
100 | struct partition_meta_info *info = &state->parts[slot].info; | ||
101 | |||
102 | snprintf(info->uuid, sizeof(info->uuid), "%08x-%02x", disksig, | ||
103 | slot); | ||
104 | info->volname[0] = 0; | ||
105 | state->parts[slot].has_info = true; | ||
106 | } | ||
107 | |||
97 | /* | 108 | /* |
98 | * Create devices for each logical partition in an extended partition. | 109 | * Create devices for each logical partition in an extended partition. |
99 | * The logical partitions form a linked list, with each entry being | 110 | * The logical partitions form a linked list, with each entry being |
@@ -106,7 +117,8 @@ static int aix_magic_present(struct parsed_partitions *state, unsigned char *p) | |||
106 | */ | 117 | */ |
107 | 118 | ||
108 | static void parse_extended(struct parsed_partitions *state, | 119 | static void parse_extended(struct parsed_partitions *state, |
109 | sector_t first_sector, sector_t first_size) | 120 | sector_t first_sector, sector_t first_size, |
121 | u32 disksig) | ||
110 | { | 122 | { |
111 | struct partition *p; | 123 | struct partition *p; |
112 | Sector sect; | 124 | Sector sect; |
@@ -166,6 +178,7 @@ static void parse_extended(struct parsed_partitions *state, | |||
166 | } | 178 | } |
167 | 179 | ||
168 | put_partition(state, state->next, next, size); | 180 | put_partition(state, state->next, next, size); |
181 | set_info(state, state->next, disksig); | ||
169 | if (SYS_IND(p) == LINUX_RAID_PARTITION) | 182 | if (SYS_IND(p) == LINUX_RAID_PARTITION) |
170 | state->parts[state->next].flags = ADDPART_FLAG_RAID; | 183 | state->parts[state->next].flags = ADDPART_FLAG_RAID; |
171 | loopct = 0; | 184 | loopct = 0; |
@@ -437,6 +450,7 @@ int msdos_partition(struct parsed_partitions *state) | |||
437 | struct partition *p; | 450 | struct partition *p; |
438 | struct fat_boot_sector *fb; | 451 | struct fat_boot_sector *fb; |
439 | int slot; | 452 | int slot; |
453 | u32 disksig; | ||
440 | 454 | ||
441 | data = read_part_sector(state, 0, §); | 455 | data = read_part_sector(state, 0, §); |
442 | if (!data) | 456 | if (!data) |
@@ -491,6 +505,8 @@ int msdos_partition(struct parsed_partitions *state) | |||
491 | #endif | 505 | #endif |
492 | p = (struct partition *) (data + 0x1be); | 506 | p = (struct partition *) (data + 0x1be); |
493 | 507 | ||
508 | disksig = le32_to_cpup((__le32 *)(data + 0x1b8)); | ||
509 | |||
494 | /* | 510 | /* |
495 | * Look for partitions in two passes: | 511 | * Look for partitions in two passes: |
496 | * First find the primary and DOS-type extended partitions. | 512 | * First find the primary and DOS-type extended partitions. |
@@ -515,11 +531,12 @@ int msdos_partition(struct parsed_partitions *state) | |||
515 | put_partition(state, slot, start, n); | 531 | put_partition(state, slot, start, n); |
516 | 532 | ||
517 | strlcat(state->pp_buf, " <", PAGE_SIZE); | 533 | strlcat(state->pp_buf, " <", PAGE_SIZE); |
518 | parse_extended(state, start, size); | 534 | parse_extended(state, start, size, disksig); |
519 | strlcat(state->pp_buf, " >", PAGE_SIZE); | 535 | strlcat(state->pp_buf, " >", PAGE_SIZE); |
520 | continue; | 536 | continue; |
521 | } | 537 | } |
522 | put_partition(state, slot, start, size); | 538 | put_partition(state, slot, start, size); |
539 | set_info(state, slot, disksig); | ||
523 | if (SYS_IND(p) == LINUX_RAID_PARTITION) | 540 | if (SYS_IND(p) == LINUX_RAID_PARTITION) |
524 | state->parts[slot].flags = ADDPART_FLAG_RAID; | 541 | state->parts[slot].flags = ADDPART_FLAG_RAID; |
525 | if (SYS_IND(p) == DM6_PARTITION) | 542 | if (SYS_IND(p) == DM6_PARTITION) |