[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