Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Oct 2019 02:49:13 +0000 (UTC)
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r353981 - stable/12/stand/i386/zfsboot
Message-ID:  <201910240249.x9O2nDEi093828@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevans
Date: Thu Oct 24 02:49:13 2019
New Revision: 353981
URL: https://svnweb.freebsd.org/changeset/base/353981

Log:
  MFC r346969: zfsboot: to detect disk size, use GPT information first
  
  If we do have GPT on disk, read the disk size from it and do not
  call int13.
  
  Since int13 does report bogus informatiopn too often, rather trust the
  partition table. We are using the same strategy with loader.

Modified:
  stable/12/stand/i386/zfsboot/zfsboot.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/stand/i386/zfsboot/zfsboot.c
==============================================================================
--- stable/12/stand/i386/zfsboot/zfsboot.c	Thu Oct 24 02:46:36 2019	(r353980)
+++ stable/12/stand/i386/zfsboot/zfsboot.c	Thu Oct 24 02:49:13 2019	(r353981)
@@ -478,6 +478,33 @@ copy_dsk(struct zfsdsk *zdsk)
 }
 
 /*
+ * Get disk size from GPT.
+ */
+static uint64_t
+drvsize_gpt(struct dsk *dskp)
+{
+#ifdef GPT
+	struct gpt_hdr hdr;
+	char *sec;
+
+	sec = dmadat->secbuf;
+	if (drvread(dskp, sec, 1, 1))
+		return (0);
+
+	memcpy(&hdr, sec, sizeof(hdr));
+	if (memcmp(hdr.hdr_sig, GPT_HDR_SIG, sizeof(hdr.hdr_sig)) != 0 ||
+	    hdr.hdr_lba_self != 1 || hdr.hdr_revision < 0x00010000 ||
+	    hdr.hdr_entsz < sizeof(struct gpt_ent) ||
+	    DEV_BSIZE % hdr.hdr_entsz != 0) {
+		return (0);
+	}
+	return (hdr.hdr_lba_alt + 1);
+#else
+	return (0);
+#endif
+}
+
+/*
  * Get disk size from eax=0x800 and 0x4800. We need to probe both
  * because 0x4800 may not be available and we would like to get more
  * or less correct disk size - if it is possible at all.
@@ -492,6 +519,11 @@ drvsize_ext(struct zfsdsk *zdsk)
 	int cyl, hds, sec;
 
 	dskp = &zdsk->dsk;
+
+	/* Try to read disk size from GPT */
+	size = drvsize_gpt(dskp);
+	if (size != 0)
+		return (size);
 
 	v86.ctl = V86_FLAGS;
 	v86.addr = 0x13;



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