summaryrefslogtreecommitdiff
path: root/sys/geom/geom_mbr.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/geom/geom_mbr.c')
-rw-r--r--sys/geom/geom_mbr.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/sys/geom/geom_mbr.c b/sys/geom/geom_mbr.c
index fdb98aa7dc2a..9e8e8cd4f9d4 100644
--- a/sys/geom/geom_mbr.c
+++ b/sys/geom/geom_mbr.c
@@ -58,6 +58,8 @@
#include <geom/geom.h>
#include <geom/geom_slice.h>
+#include "opt_geom.h"
+
#define MBR_CLASS_NAME "MBR"
#define MBREXT_CLASS_NAME "MBREXT"
@@ -197,13 +199,28 @@ g_mbr_taste(struct g_class *mp, struct g_provider *pp, int insist)
if (!error && sectorsize != 512)
break;
gsp->frontstuff = sectorsize * fwsectors;
+#ifdef GEOM_GPT
+ /*
+ * XXX: GPT hack: Read the second sector as well and back-off
+ * if it has the GPT signature. The ultimate behaviour would
+ * be to back-off if we detect a protective MBR (PMBR).
+ */
+ buf = g_read_data(cp, 0, 2 * sectorsize, &error);
+#else
buf = g_read_data(cp, 0, sectorsize, &error);
+#endif
if (buf == NULL || error != 0)
break;
if (buf[0x1fe] != 0x55 && buf[0x1ff] != 0xaa) {
g_free(buf);
break;
}
+#ifdef GEOM_GPT
+ if (!memcmp(buf + 512, "EFI PART", 8)) {
+ g_free(buf);
+ break;
+ }
+#endif
for (i = 0; i < NDOSPART; i++)
g_dec_dos_partition(
buf + DOSPARTOFF + i * sizeof(struct dos_partition),