Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d33b98fc authored by Stephen Warren's avatar Stephen Warren Committed by Jens Axboe
Browse files

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: default avatarStephen 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 283f8fc0
Loading
Loading
Loading
Loading
+19 −2
Original line number Original line Diff line number Diff line
@@ -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, &sect);
	data = read_part_sector(state, 0, &sect);
	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)
+4 −0
Original line number Original line Diff line number Diff line
@@ -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.
 *
 *