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_var...@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)