Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 16 Feb 2014 19:46:20 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r261993 - stable/10/sys/geom/part
Message-ID:  <201402161946.s1GJkKqn009650@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marcel
Date: Sun Feb 16 19:46:20 2014
New Revision: 261993
URL: http://svnweb.freebsd.org/changeset/base/261993

Log:
  MFC r258448:
  Have the GPT probe return a lower priority when the MBR is not a PMBR.

Modified:
  stable/10/sys/geom/part/g_part_gpt.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/geom/part/g_part_gpt.c
==============================================================================
--- stable/10/sys/geom/part/g_part_gpt.c	Sun Feb 16 19:44:30 2014	(r261992)
+++ stable/10/sys/geom/part/g_part_gpt.c	Sun Feb 16 19:46:20 2014	(r261993)
@@ -758,8 +758,8 @@ static int
 g_part_gpt_probe(struct g_part_table *table, struct g_consumer *cp)
 {
 	struct g_provider *pp;
-	char *buf;
-	int error, res;
+	u_char *buf;
+	int error, index, pri, res;
 
 	/* We don't nest, which means that our depth should be 0. */
 	if (table->gpt_depth != 0)
@@ -784,11 +784,21 @@ g_part_gpt_probe(struct g_part_table *ta
 	if (pp->sectorsize < MBRSIZE || pp->mediasize < 6 * pp->sectorsize)
 		return (ENOSPC);
 
-	/* Check that there's a MBR. */
+	/*
+	 * Check that there's a MBR or a PMBR. If it's a PMBR, we return
+	 * as the highest priority on a match, otherwise we assume some
+	 * GPT-unaware tool has destroyed the GPT by recreating a MBR and
+	 * we really want the MBR scheme to take precedence.
+	 */
 	buf = g_read_data(cp, 0L, pp->sectorsize, &error);
 	if (buf == NULL)
 		return (error);
 	res = le16dec(buf + DOSMAGICOFFSET);
+	pri = G_PART_PROBE_PRI_LOW;
+	for (index = 0; index < NDOSPART; index++) {
+		if (buf[DOSPARTOFF + DOSPARTSIZE * index + 4] == 0xee)
+			pri = G_PART_PROBE_PRI_HIGH;
+	}
 	g_free(buf);
 	if (res != DOSMAGIC) 
 		return (ENXIO);
@@ -800,7 +810,7 @@ g_part_gpt_probe(struct g_part_table *ta
 	res = memcmp(buf, GPT_HDR_SIG, 8);
 	g_free(buf);
 	if (res == 0)
-		return (G_PART_PROBE_PRI_HIGH);
+		return (pri);
 
 	/* No primary? Check that there's a secondary. */
 	buf = g_read_data(cp, pp->mediasize - pp->sectorsize, pp->sectorsize,
@@ -809,7 +819,7 @@ g_part_gpt_probe(struct g_part_table *ta
 		return (error);
 	res = memcmp(buf, GPT_HDR_SIG, 8); 
 	g_free(buf);
-	return ((res == 0) ? G_PART_PROBE_PRI_HIGH : ENXIO);
+	return ((res == 0) ? pri : ENXIO);
 }
 
 static int



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