diff mbox series

[v2,3/5] disk: part: Add API to get partitions with specific driver

Message ID 20230703133959.3880305-4-JPEWhacker@gmail.com
State Accepted
Commit 387f8be55b5091c4ed39221ef6a38ea7099d0a36
Delegated to: Tom Rini
Headers show
Series Fix 'mbr' command with hybrid MBR/GPT | expand

Commit Message

Joshua Watt July 3, 2023, 1:39 p.m. UTC
Adds part_driver_get_type() API which can be used to force a specific
driver to be used when getting partition information instead of relying
on auto detection.

Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
---
 disk/part.c    | 38 +++++++++++++++++++++++++++++++-------
 include/part.h | 19 ++++++++++++++++++-
 2 files changed, 49 insertions(+), 8 deletions(-)

Comments

Simon Glass July 4, 2023, 2:40 a.m. UTC | #1
On Mon, 3 Jul 2023 at 14:40, Joshua Watt <jpewhacker@gmail.com> wrote:
>
> Adds part_driver_get_type() API which can be used to force a specific

Nit: Add

> driver to be used when getting partition information instead of relying
> on auto detection.
>
> Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
> ---
>  disk/part.c    | 38 +++++++++++++++++++++++++++++++-------
>  include/part.h | 19 ++++++++++++++++++-
>  2 files changed, 49 insertions(+), 8 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>
Tom Rini July 18, 2023, 1:58 p.m. UTC | #2
On Mon, Jul 03, 2023 at 08:39:54AM -0500, Joshua Watt wrote:

> Adds part_driver_get_type() API which can be used to force a specific
> driver to be used when getting partition information instead of relying
> on auto detection.
> 
> Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
> Reviewed-by: Simon Glass <sjg@chromium.org>

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/disk/part.c b/disk/part.c
index 35300df590..1f8c786ca5 100644
--- a/disk/part.c
+++ b/disk/part.c
@@ -26,6 +26,22 @@ 
 /* Check all partition types */
 #define PART_TYPE_ALL		-1
 
+static struct part_driver *part_driver_get_type(int part_type)
+{
+	struct part_driver *drv =
+		ll_entry_start(struct part_driver, part_driver);
+	const int n_ents = ll_entry_count(struct part_driver, part_driver);
+	struct part_driver *entry;
+
+	for (entry = drv; entry != drv + n_ents; entry++) {
+		if (part_type == entry->part_type)
+			return entry;
+	}
+
+	/* Not found */
+	return NULL;
+}
+
 static struct part_driver *part_driver_lookup_type(struct blk_desc *dev_desc)
 {
 	struct part_driver *drv =
@@ -44,10 +60,7 @@  static struct part_driver *part_driver_lookup_type(struct blk_desc *dev_desc)
 			}
 		}
 	} else {
-		for (entry = drv; entry != drv + n_ents; entry++) {
-			if (dev_desc->part_type == entry->part_type)
-				return entry;
-		}
+		return part_driver_get_type(dev_desc->part_type);
 	}
 
 	/* Not found */
@@ -306,8 +319,8 @@  void part_print(struct blk_desc *dev_desc)
 		drv->print(dev_desc);
 }
 
-int part_get_info(struct blk_desc *dev_desc, int part,
-		       struct disk_partition *info)
+int part_get_info_by_type(struct blk_desc *dev_desc, int part, int part_type,
+			  struct disk_partition *info)
 {
 	struct part_driver *drv;
 
@@ -320,7 +333,12 @@  int part_get_info(struct blk_desc *dev_desc, int part,
 		info->type_guid[0] = 0;
 #endif
 
-		drv = part_driver_lookup_type(dev_desc);
+		if (part_type == PART_TYPE_UNKNOWN) {
+			drv = part_driver_lookup_type(dev_desc);
+		} else {
+			drv = part_driver_get_type(part_type);
+		}
+
 		if (!drv) {
 			debug("## Unknown partition table type %x\n",
 			      dev_desc->part_type);
@@ -340,6 +358,12 @@  int part_get_info(struct blk_desc *dev_desc, int part,
 	return -ENOENT;
 }
 
+int part_get_info(struct blk_desc *dev_desc, int part,
+		  struct disk_partition *info)
+{
+	return part_get_info_by_type(dev_desc, part, PART_TYPE_UNKNOWN, info);
+}
+
 int part_get_info_whole_disk(struct blk_desc *dev_desc,
 			     struct disk_partition *info)
 {
diff --git a/include/part.h b/include/part.h
index be75c73549..8a0c8732a6 100644
--- a/include/part.h
+++ b/include/part.h
@@ -105,7 +105,24 @@  struct blk_desc *blk_get_dev(const char *ifname, int dev);
 
 struct blk_desc *mg_disk_get_dev(int dev);
 
-/* disk/part.c */
+/**
+ * part_get_info_by_type() - Get partitions from a block device using a specific
+ * partition driver
+ *
+ * Each interface allocates its own devices and typically struct blk_desc is
+ * contained with the interface's data structure. There is no global
+ * numbering for block devices, so the interface name must be provided.
+ *
+ * @dev_desc:	Block device descriptor
+ * @part:	Partition number to read
+ * @part_type:	Partition driver to use, or PART_TYPE_UNKNOWN to automatically
+ *		choose a driver
+ * @info:	Returned partition information
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+int part_get_info_by_type(struct blk_desc *dev_desc, int part, int part_type,
+			  struct disk_partition *info);
 int part_get_info(struct blk_desc *dev_desc, int part,
 		  struct disk_partition *info);
 /**