Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Feb 2012 23:28:43 +0900 (JST)
From:      Hiroki Sato <hrs@FreeBSD.org>
To:        avg@FreeBSD.org
Cc:        wblock@wonkity.com, mandrews@bit0.com, 000.fbsd@quip.cz, freebsd-stable@FreeBSD.org, freebsd@jdc.parodius.com
Subject:   Re: New BSD Installer
Message-ID:  <20120217.232843.2212672671663755444.hrs@allbsd.org>
In-Reply-To: <4F3E3000.9000206@FreeBSD.org>
References:  <CAOjFWZ5EhGFr_Vp0%2BTRfxvgm6KZxv9QO3UfVdKurA96z3axDMQ@mail.gmail.com> <20120217.160430.406937514120319292.hrs@allbsd.org> <4F3E3000.9000206@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
----Security_Multipart0(Fri_Feb_17_23_28_43_2012_262)--
Content-Type: Multipart/Mixed;
	boundary="--Next_Part(Fri_Feb_17_23_28_43_2012_801)--"
Content-Transfer-Encoding: 7bit

----Next_Part(Fri_Feb_17_23_28_43_2012_801)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Andriy Gapon <avg@FreeBSD.org> wrote
  in <4F3E3000.9000206@FreeBSD.org>:

av> -----BEGIN PGP SIGNED MESSAGE-----
av> Hash: SHA1
av>
av> on 17/02/2012 09:04 Hiroki Sato said the following:
av> > No, the issue is our gptloader assumes the backup header is always located
av> > at the (physical) last sector while this is not mandatory in the UEFI
av> > specification.
av>
av> Are you sure?

 Yes, sure.  In the gm0->md0+md1 case, the last LBA of the "device" is
 changed (growed in size) but they can still have a valid backup
 header at "the last LBA - 1" before an attempt to grow the size of
 the volume as the last paragraph of your excerpts says.  If we
 *choose* to grow the device size permanently, the backup header must
 be relocated at the new last LBA.  However, before the relocation
 happens, the specification says both the primary and secondary header
 must be valid in the previous device size.  This is my understanding.

 This means software should assume the device size can grow and should
 not assume the backup header is always located at the last possible
 LBA on the device.  If AlternateLBA does not match "the device size -
 1", the software should recognize the location of the backup header
 based on the information in the primary header first.  The gptboot
 does not do so currently.  I didn't give it a try actually but the
 attached patch is what I want to say.

-- Hiroki

----Next_Part(Fri_Feb_17_23_28_43_2012_801)--
Content-Type: Text/X-Patch; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="gptboot-20120217-1.diff"

Index: sys/boot/common/gpt.c
===================================================================
--- sys/boot/common/gpt.c	(revision 230616)
+++ sys/boot/common/gpt.c	(working copy)
@@ -333,24 +333,26 @@
 	    gptread_table("primary", uuid, dskp, &hdr_primary,
 	    table_primary) == 0) {
 		hdr_primary_lba = hdr_primary.hdr_lba_self;
+		/* Use AlternateLBA if valid.  If not, use LastUsableLBA+34. */
+		if (hdr_primary_lba < hdr_primary.hdr_lba_alt)
+			altlba = hdr_primary.hdr_lba_alt;
+		else if (hdr_primary.hdr_lba_end != 0)
+			altlba = hdr_primary.hdr_lba_end + 34;
 		gpthdr = &hdr_primary;
 		gpttable = table_primary;
 	}

-	altlba = drvsize(dskp);
-	if (altlba > 0)
-		altlba--;
-	else if (hdr_primary_lba > 0) {
-		/*
-		 * If we cannot obtain disk size, but primary header
-		 * is valid, we can get backup header location from
-		 * there.
-		 */
-		altlba = hdr_primary.hdr_lba_alt;
+	/*
+	 * Try to locate the backup header from the media size if no primary
+	 * header found.
+	 */
+	if (hdr_primary_lba == 0) {
+		altlba = drvsize(dskp);
+		if (altlba > 0)
+			altlba--;
 	}
-	if (altlba == 0)
-		printf("%s: unable to locate backup GPT header\n", BOOTPROG);
-	else if (gptread_hdr("backup", dskp, &hdr_backup, altlba) == 0 &&
+	if (altlba != 0 &&
+	    gptread_hdr("backup", dskp, &hdr_backup, altlba) == 0 &&
 	    gptread_table("backup", uuid, dskp, &hdr_backup,
 	    table_backup) == 0) {
 		hdr_backup_lba = hdr_backup.hdr_lba_self;
@@ -359,7 +361,8 @@
 			gpttable = table_backup;
 			printf("%s: using backup GPT\n", BOOTPROG);
 		}
-	}
+	} else
+		printf("%s: unable to locate backup GPT header\n", BOOTPROG);

 	/*
 	 * Convert all BOOTONCE without BOOTME flags into BOOTFAILED.

----Next_Part(Fri_Feb_17_23_28_43_2012_801)----

----Security_Multipart0(Fri_Feb_17_23_28_43_2012_262)--
Content-Type: application/pgp-signature
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (FreeBSD)

iEYEABECAAYFAk8+ZBsACgkQTyzT2CeTzy0M3ACg05dETV4WjnlHeiZwEJP/ujqC
JC0AoL9uL7LTO2jp47qsVQFoavNaA51A
=uxfH
-----END PGP SIGNATURE-----

----Security_Multipart0(Fri_Feb_17_23_28_43_2012_262)----



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