[PATCH v3 1/4] disk: part: implement generic function part_get_info_by_uuid()
Casey Connolly
casey.connolly at linaro.org
Fri May 9 12:52:14 CEST 2025
On 5/8/25 07:23, Varadarajan Narayanan wrote:
> 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.
Unfortunately the get_info callback doesn't document the return value :(
I think it would be nice to clean this up, and document a return value
for get_info to save a bit of time but I guess this is fine with the API
being so poorly defined :(
Kind regards,>
> 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)
>>
--
Casey (she/they)
More information about the U-Boot
mailing list