[PATCH v2 5/7] disk: part_dos: Refactor to allow retrieving raw MBR partition data
Ilias Apalodimas
ilias.apalodimas at linaro.org
Fri Feb 13 13:01:55 CET 2026
On Thu, 12 Feb 2026 at 22:45, Javier Martinez Canillas
<javierm at redhat.com> wrote:
>
> Refactor the part_get_info_extended() helper function (which already
> recursively traverses DOS partitions) to optionally return the raw MBR
> partition structure (dos_partition_t).
>
> This allows other subsystems, such as EFI, to retrieve the partition
> details in the legacy MBR format.
>
> Signed-off-by: Javier Martinez Canillas <javierm at redhat.com>
> ---
Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
>
> (no changes since v1)
>
> disk/part_dos.c | 66 ++++++++++++++++++++++++++++++-------------------
> include/part.h | 14 +++++++++++
> 2 files changed, 55 insertions(+), 25 deletions(-)
>
> diff --git a/disk/part_dos.c b/disk/part_dos.c
> index a69ad8962106..4e1d01b2f21e 100644
> --- a/disk/part_dos.c
> +++ b/disk/part_dos.c
> @@ -204,7 +204,8 @@ static void print_partition_extended(struct blk_desc *desc,
> * @relative: Relative offset for the partition
> * @part_num: Current partition number
> * @which_part: Target partition number
> - * @info: Returns a pointer to the partition info
> + * @info: Returns partition information (optional)
> + * @mbr: Returns MBR partition entry (optional)
> * @disksig: Disk signature
> *
> * Return: 0 on success, negative on error
> @@ -212,7 +213,9 @@ static void print_partition_extended(struct blk_desc *desc,
> static int part_get_info_extended(struct blk_desc *desc,
> lbaint_t ext_part_sector, lbaint_t relative,
> int part_num, int which_part,
> - struct disk_partition *info, uint disksig)
> + struct disk_partition *info,
> + dos_partition_t *mbr,
> + uint disksig)
> {
> ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, desc->blksz);
> struct disk_partition wdinfo = { 0 };
> @@ -243,9 +246,11 @@ static int part_get_info_extended(struct blk_desc *desc,
> if (CONFIG_IS_ENABLED(PARTITION_UUIDS) && !ext_part_sector)
> disksig = get_unaligned_le32(&buffer[DOS_PART_DISKSIG_OFFSET]);
>
> - ret = part_get_info_whole_disk(desc, &wdinfo);
> - if (ret)
> - return ret;
> + if (info) {
> + ret = part_get_info_whole_disk(desc, &wdinfo);
> + if (ret)
> + return ret;
> + }
>
> /* Print all primary/logical partitions */
> pt = (dos_partition_t *) (buffer + DOS_PART_TBL_OFFSET);
> @@ -258,25 +263,29 @@ static int part_get_info_extended(struct blk_desc *desc,
> (pt->sys_ind != 0) &&
> (part_num == which_part) &&
> (ext_part_sector == 0 || is_extended(pt->sys_ind) == 0)) {
> - if (wdinfo.blksz > DOS_PART_DEFAULT_SECTOR)
> - info->blksz = wdinfo.blksz;
> - else
> - info->blksz = DOS_PART_DEFAULT_SECTOR;
> - info->start = (lbaint_t)(ext_part_sector +
> - get_unaligned_le32(&pt->start_sect));
> - info->size = (lbaint_t)get_unaligned_le32(&pt->nr_sects);
> - part_set_generic_name(desc, part_num,
> - (char *)info->name);
> - /* sprintf(info->type, "%d, pt->sys_ind); */
> - strcpy((char *)info->type, "U-Boot");
> - info->bootable = get_bootable(pt);
> - if (CONFIG_IS_ENABLED(PARTITION_UUIDS)) {
> - char str[12];
> -
> - sprintf(str, "%08x-%02x", disksig, part_num);
> - disk_partition_set_uuid(info, str);
> + if (info) {
> + if (wdinfo.blksz > DOS_PART_DEFAULT_SECTOR)
> + info->blksz = wdinfo.blksz;
> + else
> + info->blksz = DOS_PART_DEFAULT_SECTOR;
> + info->start = (lbaint_t)(ext_part_sector +
> + get_unaligned_le32(&pt->start_sect));
> + info->size = (lbaint_t)get_unaligned_le32(&pt->nr_sects);
> + part_set_generic_name(desc, part_num,
> + (char *)info->name);
> + /* sprintf(info->type, "%d, pt->sys_ind); */
> + strcpy((char *)info->type, "U-Boot");
> + info->bootable = get_bootable(pt);
> + if (CONFIG_IS_ENABLED(PARTITION_UUIDS)) {
> + char str[12];
> +
> + sprintf(str, "%08x-%02x", disksig, part_num);
> + disk_partition_set_uuid(info, str);
> + }
> + info->sys_ind = pt->sys_ind;
> }
> - info->sys_ind = pt->sys_ind;
> + if (mbr)
> + memcpy(mbr, pt, sizeof(*mbr));
> return 0;
> }
>
> @@ -296,7 +305,8 @@ static int part_get_info_extended(struct blk_desc *desc,
>
> return part_get_info_extended(desc, lba_start,
> ext_part_sector == 0 ? lba_start : relative,
> - part_num, which_part, info, disksig);
> + part_num, which_part, info,
> + mbr, disksig);
> }
> }
>
> @@ -328,7 +338,13 @@ static void __maybe_unused part_print_dos(struct blk_desc *desc)
> static int __maybe_unused part_get_info_dos(struct blk_desc *desc, int part,
> struct disk_partition *info)
> {
> - return part_get_info_extended(desc, 0, 0, 1, part, info, 0);
> + return part_get_info_extended(desc, 0, 0, 1, part, info, NULL, 0);
> +}
> +
> +int __maybe_unused part_get_mbr(struct blk_desc *desc, int part,
> + dos_partition_t *mbr)
> +{
> + return part_get_info_extended(desc, 0, 0, 1, part, NULL, mbr, 0);
> }
>
> int is_valid_dos_buf(void *buf)
> diff --git a/include/part.h b/include/part.h
> index daebbbc2e68f..aed089d00f64 100644
> --- a/include/part.h
> +++ b/include/part.h
> @@ -704,6 +704,20 @@ int write_mbr_partitions(struct blk_desc *dev,
> int layout_mbr_partitions(struct disk_partition *p, int count,
> lbaint_t total_sectors);
>
> +/**
> + * part_get_mbr() - get the MBR partition record of a partition
> + *
> + * This function reads the MBR partition record for a given block
> + * device and partition number.
> + *
> + * @desc: block device descriptor
> + * @part: partition number for which to return the partition record
> + * @mbr: MBR partition record
> + *
> + * Return: 0 on success, otherwise error
> + */
> +int part_get_mbr(struct blk_desc *desc, int part, dos_partition_t *mbr);
> +
> #endif
>
> #if CONFIG_IS_ENABLED(PARTITIONS)
> --
> 2.53.0
>
More information about the U-Boot
mailing list