Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Nov 2019 18:57:00 +0000 (UTC)
From:      Toomas Soome <tsoome@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r354743 - head/stand/efi/libefi
Message-ID:  <201911151857.xAFIv0FU001177@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: tsoome
Date: Fri Nov 15 18:57:00 2019
New Revision: 354743
URL: https://svnweb.freebsd.org/changeset/base/354743

Log:
  loader: r354415 did miss to sort subpaths below the partitions
  
  Tested on actual system (MBP with UEFI 1.10).

Modified:
  head/stand/efi/libefi/efipart.c

Modified: head/stand/efi/libefi/efipart.c
==============================================================================
--- head/stand/efi/libefi/efipart.c	Fri Nov 15 18:48:14 2019	(r354742)
+++ head/stand/efi/libefi/efipart.c	Fri Nov 15 18:57:00 2019	(r354743)
@@ -506,9 +506,12 @@ efipart_initcd(void)
 static bool
 efipart_hdinfo_add_node(pdinfo_t *hd, EFI_DEVICE_PATH *node)
 {
-	pdinfo_t *pd, *last;
-	VENDOR_DEVICE_PATH *ven_node;
+	pdinfo_t *pd, *ptr;
 
+	if (node == NULL)
+		return (false);
+
+	/* Find our disk device. */
 	STAILQ_FOREACH(pd, &hdinfo, pd_link) {
 		if (efi_devpath_is_prefix(pd->pd_devpath, hd->pd_devpath))
 			break;
@@ -516,13 +519,28 @@ efipart_hdinfo_add_node(pdinfo_t *hd, EFI_DEVICE_PATH 
 	if (pd == NULL)
 		return (false);
 
+	/* If the node is not MEDIA_HARDDRIVE_DP, it is sub-partition. */
+	if (DevicePathSubType(node) != MEDIA_HARDDRIVE_DP) {
+		STAILQ_FOREACH(ptr, &pd->pd_part, pd_link) {
+			if (efi_devpath_is_prefix(ptr->pd_devpath,
+			    hd->pd_devpath))
+				break;
+		}
+		/*
+		 * ptr == NULL means we have handles in unexpected order
+		 * and we would need to re-order the partitions later.
+		 */
+		if (ptr != NULL)
+			pd = ptr;
+	}
+
 	/* Add the partition. */
 	if (DevicePathSubType(node) == MEDIA_HARDDRIVE_DP) {
 		hd->pd_unit = ((HARDDRIVE_DEVICE_PATH *)node)->PartitionNumber;
 	} else {
-		last = STAILQ_LAST(&pd->pd_part, pdinfo, pd_link);
-		if (last != NULL)
-			hd->pd_unit = last->pd_unit + 1;
+		ptr = STAILQ_LAST(&pd->pd_part, pdinfo, pd_link);
+		if (ptr != NULL)
+			hd->pd_unit = ptr->pd_unit + 1;
 		else
 			hd->pd_unit = 0;
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201911151857.xAFIv0FU001177>