diff mbox series

[U-Boot] efi_loader: search all possible disk partitions

Message ID 20171010025526.85329-1-jsg@jsg.id.au
State Accepted
Commit 16a73b249d138fedeb188710533902ed7aac1ddc
Delegated to: Alexander Graf
Headers show
Series [U-Boot] efi_loader: search all possible disk partitions | expand

Commit Message

Jonathan Gray Oct. 10, 2017, 2:55 a.m. UTC
When searching for partitions don't stop if a partition is not present
for a given partition number as there may be valid partitions after.

Search for up to MAX_SEARCH_PARTITIONS matching the other callers of
part_get_info().

This allows OpenBSD to boot via the efi_loader on rpi_3 again after
changes made after U-Boot 2017.09.  With MBR partitioning OpenBSD will
by default use the fourth partition for the 0xA6 (OpenBSD) partition.

Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
---
 lib/efi_loader/efi_disk.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

Comments

Alexander Graf Oct. 10, 2017, 8:01 a.m. UTC | #1
> When searching for partitions don't stop if a partition is not present
> for a given partition number as there may be valid partitions after.
> 
> Search for up to MAX_SEARCH_PARTITIONS matching the other callers of
> part_get_info().
> 
> This allows OpenBSD to boot via the efi_loader on rpi_3 again after
> changes made after U-Boot 2017.09.  With MBR partitioning OpenBSD will
> by default use the fourth partition for the 0xA6 (OpenBSD) partition.
> 
> Signed-off-by: Jonathan Gray <jsg@jsg.id.au>

Thanks, applied to efi-next

Alex
Jonathan Gray Oct. 10, 2017, 10:37 a.m. UTC | #2
On Tue, Oct 10, 2017 at 10:01:46AM +0200, Alexander Graf wrote:
> > When searching for partitions don't stop if a partition is not present
> > for a given partition number as there may be valid partitions after.
> > 
> > Search for up to MAX_SEARCH_PARTITIONS matching the other callers of
> > part_get_info().
> > 
> > This allows OpenBSD to boot via the efi_loader on rpi_3 again after
> > changes made after U-Boot 2017.09.  With MBR partitioning OpenBSD will
> > by default use the fourth partition for the 0xA6 (OpenBSD) partition.
> > 
> > Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
> 
> Thanks, applied to efi-next
> 
> Alex
> 

Thanks, looking over it again I realised one of the loops is now
incrementing the partition number twice per loop so I have sent a
further patch to the list to correct that.
From 18d6201e4e09b9e8d6bc418b23029280a29eb015 Mon Sep 17 00:00:00 2001
From: Jonathan Gray <jsg@jsg.id.au>
Date: Tue, 10 Oct 2017 21:25:16 +1100
Subject: [PATCH] efi_loader: don't increment part twice per loop

Correct a mistake in the part number handling of
16a73b249d138fedeb188710533902ed7aac1ddc and only increment part once
per loop.

Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
---
 lib/efi_loader/efi_disk.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
index 6b192701a8..e61dbc8058 100644
--- a/lib/efi_loader/efi_disk.c
+++ b/lib/efi_loader/efi_disk.c
@@ -360,7 +360,6 @@ int efi_disk_register(void)
 					continue;
 				efi_disk_add_dev(devname, if_typename, desc,
 						 i, 0, part);
-				part++;
 			}
 
 			/* ... and add block device: */
Peter Robinson Oct. 10, 2017, 12:38 p.m. UTC | #3
On Tue, Oct 10, 2017 at 3:55 AM, Jonathan Gray <jsg@jsg.id.au> wrote:
> When searching for partitions don't stop if a partition is not present
> for a given partition number as there may be valid partitions after.
>
> Search for up to MAX_SEARCH_PARTITIONS matching the other callers of
> part_get_info().
>
> This allows OpenBSD to boot via the efi_loader on rpi_3 again after
> changes made after U-Boot 2017.09.  With MBR partitioning OpenBSD will
> by default use the fourth partition for the 0xA6 (OpenBSD) partition.
>
> Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
Tested-by: Peter Robinson <pbrobinson@gmail.com>

Tested on the Pine64, fixes the issues I saw with that device.

> ---
>  lib/efi_loader/efi_disk.c | 20 ++++++++++++--------
>  1 file changed, 12 insertions(+), 8 deletions(-)
>
> diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
> index 47b487aa30..6b192701a8 100644
> --- a/lib/efi_loader/efi_disk.c
> +++ b/lib/efi_loader/efi_disk.c
> @@ -254,18 +254,19 @@ static int efi_disk_create_eltorito(struct blk_desc *desc,
>  #if CONFIG_IS_ENABLED(ISO_PARTITION)
>         char devname[32] = { 0 }; /* dp->str is u16[32] long */
>         disk_partition_t info;
> -       int part = 1;
> +       int part;
>
>         if (desc->part_type != PART_TYPE_ISO)
>                 return 0;
>
>         /* and devices for each partition: */
> -       while (!part_get_info(desc, part, &info)) {
> +       for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
> +               if (part_get_info(desc, part, &info))
> +                       continue;
>                 snprintf(devname, sizeof(devname), "%s:%d", pdevname,
>                          part);
>                 efi_disk_add_dev(devname, if_typename, desc, diskid,
>                                  info.start, part);
> -               part++;
>                 disks++;
>         }
>
> @@ -299,15 +300,16 @@ int efi_disk_register(void)
>                 struct blk_desc *desc = dev_get_uclass_platdata(dev);
>                 const char *if_typename = dev->driver->name;
>                 disk_partition_t info;
> -               int part = 1;
> +               int part;
>
>                 printf("Scanning disk %s...\n", dev->name);
>
>                 /* add devices for each partition: */
> -               while (!part_get_info(desc, part, &info)) {
> +               for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
> +                       if (part_get_info(desc, part, &info))
> +                               continue;
>                         efi_disk_add_dev(dev->name, if_typename, desc,
>                                          desc->devnum, 0, part);
> -                       part++;
>                 }
>
>                 /* ... and add block device: */
> @@ -341,7 +343,7 @@ int efi_disk_register(void)
>                         struct blk_desc *desc;
>                         char devname[32] = { 0 }; /* dp->str is u16[32] long */
>                         disk_partition_t info;
> -                       int part = 1;
> +                       int part;
>
>                         desc = blk_get_devnum_by_type(if_type, i);
>                         if (!desc)
> @@ -353,7 +355,9 @@ int efi_disk_register(void)
>                                  if_typename, i);
>
>                         /* add devices for each partition: */
> -                       while (!part_get_info(desc, part, &info)) {
> +                       for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
> +                               if (part_get_info(desc, part, &info))
> +                                       continue;
>                                 efi_disk_add_dev(devname, if_typename, desc,
>                                                  i, 0, part);
>                                 part++;
> --
> 2.14.2
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot
diff mbox series

Patch

diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
index 47b487aa30..6b192701a8 100644
--- a/lib/efi_loader/efi_disk.c
+++ b/lib/efi_loader/efi_disk.c
@@ -254,18 +254,19 @@  static int efi_disk_create_eltorito(struct blk_desc *desc,
 #if CONFIG_IS_ENABLED(ISO_PARTITION)
 	char devname[32] = { 0 }; /* dp->str is u16[32] long */
 	disk_partition_t info;
-	int part = 1;
+	int part;
 
 	if (desc->part_type != PART_TYPE_ISO)
 		return 0;
 
 	/* and devices for each partition: */
-	while (!part_get_info(desc, part, &info)) {
+	for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
+		if (part_get_info(desc, part, &info))
+			continue;
 		snprintf(devname, sizeof(devname), "%s:%d", pdevname,
 			 part);
 		efi_disk_add_dev(devname, if_typename, desc, diskid,
 				 info.start, part);
-		part++;
 		disks++;
 	}
 
@@ -299,15 +300,16 @@  int efi_disk_register(void)
 		struct blk_desc *desc = dev_get_uclass_platdata(dev);
 		const char *if_typename = dev->driver->name;
 		disk_partition_t info;
-		int part = 1;
+		int part;
 
 		printf("Scanning disk %s...\n", dev->name);
 
 		/* add devices for each partition: */
-		while (!part_get_info(desc, part, &info)) {
+		for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
+			if (part_get_info(desc, part, &info))
+				continue;
 			efi_disk_add_dev(dev->name, if_typename, desc,
 					 desc->devnum, 0, part);
-			part++;
 		}
 
 		/* ... and add block device: */
@@ -341,7 +343,7 @@  int efi_disk_register(void)
 			struct blk_desc *desc;
 			char devname[32] = { 0 }; /* dp->str is u16[32] long */
 			disk_partition_t info;
-			int part = 1;
+			int part;
 
 			desc = blk_get_devnum_by_type(if_type, i);
 			if (!desc)
@@ -353,7 +355,9 @@  int efi_disk_register(void)
 				 if_typename, i);
 
 			/* add devices for each partition: */
-			while (!part_get_info(desc, part, &info)) {
+			for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
+				if (part_get_info(desc, part, &info))
+					continue;
 				efi_disk_add_dev(devname, if_typename, desc,
 						 i, 0, part);
 				part++;