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>
This commit is contained in:
parent
283f8fc039
commit
d33b98fc82
2 changed files with 23 additions and 2 deletions
|
@ -94,6 +94,17 @@ static int aix_magic_present(struct parsed_partitions *state, unsigned char *p)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_info(struct parsed_partitions *state, int slot,
|
||||||
|
u32 disksig)
|
||||||
|
{
|
||||||
|
struct partition_meta_info *info = &state->parts[slot].info;
|
||||||
|
|
||||||
|
snprintf(info->uuid, sizeof(info->uuid), "%08x-%02x", disksig,
|
||||||
|
slot);
|
||||||
|
info->volname[0] = 0;
|
||||||
|
state->parts[slot].has_info = true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create devices for each logical partition in an extended partition.
|
* Create devices for each logical partition in an extended partition.
|
||||||
* The logical partitions form a linked list, with each entry being
|
* 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)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void parse_extended(struct parsed_partitions *state,
|
static void parse_extended(struct parsed_partitions *state,
|
||||||
sector_t first_sector, sector_t first_size)
|
sector_t first_sector, sector_t first_size,
|
||||||
|
u32 disksig)
|
||||||
{
|
{
|
||||||
struct partition *p;
|
struct partition *p;
|
||||||
Sector sect;
|
Sector sect;
|
||||||
|
@ -166,6 +178,7 @@ static void parse_extended(struct parsed_partitions *state,
|
||||||
}
|
}
|
||||||
|
|
||||||
put_partition(state, state->next, next, size);
|
put_partition(state, state->next, next, size);
|
||||||
|
set_info(state, state->next, disksig);
|
||||||
if (SYS_IND(p) == LINUX_RAID_PARTITION)
|
if (SYS_IND(p) == LINUX_RAID_PARTITION)
|
||||||
state->parts[state->next].flags = ADDPART_FLAG_RAID;
|
state->parts[state->next].flags = ADDPART_FLAG_RAID;
|
||||||
loopct = 0;
|
loopct = 0;
|
||||||
|
@ -437,6 +450,7 @@ int msdos_partition(struct parsed_partitions *state)
|
||||||
struct partition *p;
|
struct partition *p;
|
||||||
struct fat_boot_sector *fb;
|
struct fat_boot_sector *fb;
|
||||||
int slot;
|
int slot;
|
||||||
|
u32 disksig;
|
||||||
|
|
||||||
data = read_part_sector(state, 0, §);
|
data = read_part_sector(state, 0, §);
|
||||||
if (!data)
|
if (!data)
|
||||||
|
@ -491,6 +505,8 @@ int msdos_partition(struct parsed_partitions *state)
|
||||||
#endif
|
#endif
|
||||||
p = (struct partition *) (data + 0x1be);
|
p = (struct partition *) (data + 0x1be);
|
||||||
|
|
||||||
|
disksig = le32_to_cpup((__le32 *)(data + 0x1b8));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Look for partitions in two passes:
|
* Look for partitions in two passes:
|
||||||
* First find the primary and DOS-type extended partitions.
|
* First find the primary and DOS-type extended partitions.
|
||||||
|
@ -515,11 +531,12 @@ int msdos_partition(struct parsed_partitions *state)
|
||||||
put_partition(state, slot, start, n);
|
put_partition(state, slot, start, n);
|
||||||
|
|
||||||
strlcat(state->pp_buf, " <", PAGE_SIZE);
|
strlcat(state->pp_buf, " <", PAGE_SIZE);
|
||||||
parse_extended(state, start, size);
|
parse_extended(state, start, size, disksig);
|
||||||
strlcat(state->pp_buf, " >", PAGE_SIZE);
|
strlcat(state->pp_buf, " >", PAGE_SIZE);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
put_partition(state, slot, start, size);
|
put_partition(state, slot, start, size);
|
||||||
|
set_info(state, slot, disksig);
|
||||||
if (SYS_IND(p) == LINUX_RAID_PARTITION)
|
if (SYS_IND(p) == LINUX_RAID_PARTITION)
|
||||||
state->parts[slot].flags = ADDPART_FLAG_RAID;
|
state->parts[slot].flags = ADDPART_FLAG_RAID;
|
||||||
if (SYS_IND(p) == DM6_PARTITION)
|
if (SYS_IND(p) == DM6_PARTITION)
|
||||||
|
|
|
@ -189,6 +189,10 @@ done:
|
||||||
* used when disk name of partitioned disk ends on a digit.
|
* used when disk name of partitioned disk ends on a digit.
|
||||||
* 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the
|
* 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the
|
||||||
* unique id of a partition if the partition table provides it.
|
* unique id of a partition if the partition table provides it.
|
||||||
|
* The UUID may be either an EFI/GPT UUID, or refer to an MSDOS
|
||||||
|
* partition using the format SSSSSSSS-PP, where SSSSSSSS is a zero-
|
||||||
|
* filled hex representation of the 32-bit "NT disk signature", and PP
|
||||||
|
* is a zero-filled hex representation of the 1-based partition number.
|
||||||
* 7) PARTUUID=<UUID>/PARTNROFF=<int> to select a partition in relation to
|
* 7) PARTUUID=<UUID>/PARTNROFF=<int> to select a partition in relation to
|
||||||
* a partition with a known unique id.
|
* a partition with a known unique id.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue