0b5e55
diff -up util-linux-2.23.2/libblkid/src/partitions/gpt.c.kzak util-linux-2.23.2/libblkid/src/partitions/gpt.c
0b5e55
--- util-linux-2.23.2/libblkid/src/partitions/gpt.c.kzak	2013-07-30 10:39:26.206738239 +0200
0b5e55
+++ util-linux-2.23.2/libblkid/src/partitions/gpt.c	2014-01-23 11:06:17.364011293 +0100
0b5e55
@@ -156,13 +156,15 @@ static int last_lba(blkid_probe pr, uint
0b5e55
  * Note that the PMBR detection is optional (enabled by default) and could be
0b5e55
  * disabled by BLKID_PARTS_FOPCE_GPT flag (see also blkid_paertitions_set_flags()).
0b5e55
  */
0b5e55
-static int is_pmbr_valid(blkid_probe pr)
0b5e55
+static int is_pmbr_valid(blkid_probe pr, int *has)
0b5e55
 {
0b5e55
 	int flags = blkid_partitions_get_flags(pr);
0b5e55
 	unsigned char *data;
0b5e55
 	struct dos_partition *p;
0b5e55
 	int i;
0b5e55
 
0b5e55
+	if (has)
0b5e55
+		*has = 0;
0b5e55
 	if (flags & BLKID_PARTS_FORCE_GPT)
0b5e55
 		goto ok;			/* skip PMBR check */
0b5e55
 
0b5e55
@@ -182,6 +184,8 @@ static int is_pmbr_valid(blkid_probe pr)
0b5e55
 failed:
0b5e55
 	return 0;
0b5e55
 ok:
0b5e55
+	if (has)
0b5e55
+		*has = 1;
0b5e55
 	return 1;
0b5e55
 }
0b5e55
 
0b5e55
@@ -305,7 +309,7 @@ static int probe_gpt_pt(blkid_probe pr,
0b5e55
 	if (last_lba(pr, &lastlba))
0b5e55
 		goto nothing;
0b5e55
 
0b5e55
-	if (!is_pmbr_valid(pr))
0b5e55
+	if (!is_pmbr_valid(pr, NULL))
0b5e55
 		goto nothing;
0b5e55
 
0b5e55
 	h = get_gpt_header(pr, &hdr, &e, (lba = GPT_PRIMARY_LBA), lastlba);
0b5e55
@@ -410,3 +414,39 @@ const struct blkid_idinfo gpt_pt_idinfo
0b5e55
 	.magics		= BLKID_NONE_MAGIC
0b5e55
 };
0b5e55
 
0b5e55
+
0b5e55
+
0b5e55
+/* probe for *alone* protective MBR */
0b5e55
+static int probe_pmbr_pt(blkid_probe pr,
0b5e55
+		const struct blkid_idmag *mag __attribute__((__unused__)))
0b5e55
+{
0b5e55
+	int has = 0;
0b5e55
+	struct gpt_entry *e;
0b5e55
+	uint64_t lastlba = 0;
0b5e55
+	struct gpt_header hdr;
0b5e55
+
0b5e55
+	if (last_lba(pr, &lastlba))
0b5e55
+		goto nothing;
0b5e55
+
0b5e55
+	is_pmbr_valid(pr, &has;;
0b5e55
+	if (!has)
0b5e55
+		goto nothing;
0b5e55
+
0b5e55
+	if (!get_gpt_header(pr, &hdr, &e, GPT_PRIMARY_LBA, lastlba) &&
0b5e55
+	    !get_gpt_header(pr, &hdr, &e, lastlba, lastlba))
0b5e55
+		return 0;
0b5e55
+nothing:
0b5e55
+	return 1;
0b5e55
+}
0b5e55
+
0b5e55
+const struct blkid_idinfo pmbr_pt_idinfo =
0b5e55
+{
0b5e55
+	.name		= "PMBR",
0b5e55
+	.probefunc	= probe_pmbr_pt,
0b5e55
+	.magics		=
0b5e55
+	{
0b5e55
+		{ .magic = "\x55\xAA", .len = 2, .sboff = 510 },
0b5e55
+		{ NULL }
0b5e55
+	}
0b5e55
+};
0b5e55
+
0b5e55
diff -up util-linux-2.23.2/libblkid/src/partitions/partitions.c.kzak util-linux-2.23.2/libblkid/src/partitions/partitions.c
0b5e55
--- util-linux-2.23.2/libblkid/src/partitions/partitions.c.kzak	2013-07-30 10:39:26.207738249 +0200
0b5e55
+++ util-linux-2.23.2/libblkid/src/partitions/partitions.c	2014-01-23 11:06:17.364011293 +0100
0b5e55
@@ -125,6 +125,7 @@ static const struct blkid_idinfo *idinfo
0b5e55
 	&sun_pt_idinfo,
0b5e55
 	&dos_pt_idinfo,
0b5e55
 	&gpt_pt_idinfo,
0b5e55
+	&pmbr_pt_idinfo,	/* always after GPT */
0b5e55
 	&mac_pt_idinfo,
0b5e55
 	&ultrix_pt_idinfo,
0b5e55
 	&bsd_pt_idinfo,
0b5e55
diff -up util-linux-2.23.2/libblkid/src/partitions/partitions.h.kzak util-linux-2.23.2/libblkid/src/partitions/partitions.h
0b5e55
--- util-linux-2.23.2/libblkid/src/partitions/partitions.h.kzak	2013-07-30 10:39:26.208738259 +0200
0b5e55
+++ util-linux-2.23.2/libblkid/src/partitions/partitions.h	2014-01-23 11:06:17.364011293 +0100
0b5e55
@@ -59,6 +59,7 @@ extern const struct blkid_idinfo mac_pt_
0b5e55
 extern const struct blkid_idinfo dos_pt_idinfo;
0b5e55
 extern const struct blkid_idinfo minix_pt_idinfo;
0b5e55
 extern const struct blkid_idinfo gpt_pt_idinfo;
0b5e55
+extern const struct blkid_idinfo pmbr_pt_idinfo;
0b5e55
 extern const struct blkid_idinfo ultrix_pt_idinfo;
0b5e55
 
0b5e55
 #endif /* BLKID_PARTITIONS_H */