[PATCH v3 1/4] disk: part: implement generic function part_get_info_by_uuid()

Varadarajan Narayanan quic_varada at quicinc.com
Thu May 8 07:23:44 CEST 2025


On Wed, May 07, 2025 at 01:47:40PM +0200, Casey Connolly wrote:
> Hi Varadarajan,
>
> On 5/7/25 13:28, Varadarajan Narayanan wrote:
> > Add function to search for a partition by UUID as partition
> > names may not be unique.
> >
> > Signed-off-by: Varadarajan Narayanan <quic_varada at quicinc.com>
> > ---
> >   disk/part.c    | 37 +++++++++++++++++++++++++++++++++++++
> >   include/part.h | 20 ++++++++++++++++++++
> >   2 files changed, 57 insertions(+)
> >
> > diff --git a/disk/part.c b/disk/part.c
> > index 303178161c0..abae79a55a7 100644
> > --- a/disk/part.c
> > +++ b/disk/part.c
> > @@ -698,6 +698,43 @@ int part_get_info_by_name(struct blk_desc *desc, const char *name,
> >   	return -ENOENT;
> >   }
> > +int part_get_info_by_uuid(struct blk_desc *desc, const char *uuid,
> > +			  struct disk_partition *info)
> > +{
> > +#if CONFIG_IS_ENABLED(PARTITION_UUIDS)
>
> Please refer to checkpatch output (the b4 tool will run this for you
> automatically).

Ok

> 	if (!CONFIG_IS_ENABLED(PARTITION_UUIDS))
> 		return -ENOENT;
>
> > +	struct part_driver *part_drv;
> > +	int ret;
> > +	int i;
> > +
> > +	part_drv = part_driver_lookup_type(desc);
> > +	if (!part_drv)
> > +		return -1;
> > +
> > +	if (!part_drv->get_info) {
> > +		log_debug("## Driver %s does not have the get_info() method\n",
> > +			  part_drv->name);
> > +		return -ENOSYS;
> > +	}
> > +
> > +	for (i = 1; i < part_drv->max_entries; i++) {
> > +		ret = part_drv->get_info(desc, i, info);
> > +		if (ret != 0) {
> > +			/*
> > +			 * Partition with this index can't be obtained, but
> > +			 * further partitions might be, so keep checking.
> > +			 */
> > +			continue;
>
> For part_efi (which is the only one relevant here I think?) you can check
> for -EPERM which signals the end of the partition list I believe. Then we
> aren't calling get_info() 128 times for every LUN...

This is a replica of part_get_info_by_name() - [1]. Not sure why it has
it that way and didn't want to miss corner cases (if any). Please let
me know if still you would prefer to change to check for -EPERM.

Thanks
Varada

1 - https://source.denx.de/u-boot/u-boot/-/blob/master/disk/part.c?ref_type=heads#L685

> +		}
> > +
> > +		if (!strncasecmp(uuid, disk_partition_uuid(info), UUID_STR_LEN)) {
> > +			/* matched */
> > +			return i;
> > +		}
> > +	}
> > +#endif
> > +	return -ENOENT;
> > +}
> > +
> >   /**
> >    * Get partition info from device number and partition name.
> >    *
> > diff --git a/include/part.h b/include/part.h
> > index fcb3c13dea4..3e6eb0ec33f 100644
> > --- a/include/part.h
> > +++ b/include/part.h
> > @@ -315,6 +315,20 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
> >   int part_get_info_by_name(struct blk_desc *desc, const char *name,
> >   			  struct disk_partition *info);
> > +/**
> > + * part_get_info_by_uuid() - Search for a partition by uuid
> > + *                           among all available registered partitions
> > + *
> > + * @desc:	block device descriptor
> > + * @uuid:	the specified table entry uuid
> > + * @info:	the disk partition info
> > + *
> > + * Return: the partition number on match (starting on 1), -ENOENT on no match,
> > + * otherwise error
> > + */
> > +int part_get_info_by_uuid(struct blk_desc *desc, const char *uuid,
> > +			  struct disk_partition *info);
> > +
> >   /**
> >    * part_get_info_by_dev_and_name_or_num() - Get partition info from dev number
> >    *					    and part name, or dev number and
> > @@ -386,6 +400,12 @@ static inline int part_get_info_by_name(struct blk_desc *desc, const char *name,
> >   	return -ENOENT;
> >   }
> > +static inline int part_get_info_by_uuid(struct blk_desc *desc, const char *uuid,
> > +					struct disk_partition *info)
> > +{
> > +	return -ENOENT;
> > +}
> > +
> >   static inline int
> >   part_get_info_by_dev_and_name_or_num(const char *dev_iface,
> >   				     const char *dev_part_str,
>
> --
> Casey (she/they)
>


More information about the U-Boot mailing list