svn commit: r292057 - in head/sys: boot/common geom/part
Andrey V. Elsukov
ae at FreeBSD.org
Thu Dec 10 10:35:09 UTC 2015
Author: ae
Date: Thu Dec 10 10:35:07 2015
New Revision: 292057
URL: https://svnweb.freebsd.org/changeset/base/292057
Log:
Make detection of GPT a bit more reliable.
When we are detecting a partition table and didn't find PMBR, try to
read backup GPT header from the last sector and if it is correct,
assume that we have GPT.
Reviewed by: rpokala
MFC after: 1 month
Differential Revision: https://reviews.freebsd.org/D4282
Modified:
head/sys/boot/common/part.c
head/sys/geom/part/g_part_gpt.c
Modified: head/sys/boot/common/part.c
==============================================================================
--- head/sys/boot/common/part.c Thu Dec 10 07:45:58 2015 (r292056)
+++ head/sys/boot/common/part.c Thu Dec 10 10:35:07 2015 (r292057)
@@ -301,12 +301,12 @@ ptable_gptread(struct ptable *table, voi
}
}
}
- DEBUG("GPT detected");
if (pri == 0 && sec == 0) {
/* Both primary and backup tables are invalid. */
table->type = PTABLE_NONE;
goto out;
}
+ DEBUG("GPT detected");
size = MIN(hdr.hdr_entries * hdr.hdr_entsz,
MAXTBLSZ * table->sectorsize);
for (i = 0; i < size / hdr.hdr_entsz; i++) {
@@ -635,6 +635,11 @@ ptable_open(void *dev, off_t sectors, ui
if (buf[DOSMAGICOFFSET] != 0x55 ||
buf[DOSMAGICOFFSET + 1] != 0xaa) {
DEBUG("magic sequence not found");
+#if defined(LOADER_GPT_SUPPORT)
+ /* There is no PMBR, check that we have backup GPT */
+ table->type = PTABLE_GPT;
+ table = ptable_gptread(table, dev, dread);
+#endif
goto out;
}
/* Check that we have PMBR. Also do some validation. */
Modified: head/sys/geom/part/g_part_gpt.c
==============================================================================
--- head/sys/geom/part/g_part_gpt.c Thu Dec 10 07:45:58 2015 (r292056)
+++ head/sys/geom/part/g_part_gpt.c Thu Dec 10 10:35:07 2015 (r292057)
@@ -823,22 +823,23 @@ g_part_gpt_probe(struct g_part_table *ta
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);
+ if (res == DOSMAGIC) {
+ for (index = 0; index < NDOSPART; index++) {
+ if (buf[DOSPARTOFF + DOSPARTSIZE * index + 4] == 0xee)
+ pri = G_PART_PROBE_PRI_HIGH;
+ }
+ g_free(buf);
- /* Check that there's a primary header. */
- buf = g_read_data(cp, pp->sectorsize, pp->sectorsize, &error);
- if (buf == NULL)
- return (error);
- res = memcmp(buf, GPT_HDR_SIG, 8);
- g_free(buf);
- if (res == 0)
- return (pri);
+ /* Check that there's a primary header. */
+ buf = g_read_data(cp, pp->sectorsize, pp->sectorsize, &error);
+ if (buf == NULL)
+ return (error);
+ res = memcmp(buf, GPT_HDR_SIG, 8);
+ g_free(buf);
+ if (res == 0)
+ return (pri);
+ } else
+ g_free(buf);
/* No primary? Check that there's a secondary. */
buf = g_read_data(cp, pp->mediasize - pp->sectorsize, pp->sectorsize,
More information about the svn-src-head
mailing list