Bug 120990

Summary: [patch] support "BIOS Boot" partition type in gpt(8)
Product: Base System Reporter: Robert Millan <rmh>
Component: binAssignee: Andrey V. Elsukov <ae>
Status: Closed FIXED    
Severity: Affects Only Me    
Priority: Normal    
Version: 1.0-CURRENT   
Hardware: Any   
OS: Any   
Attachments:
Description Flags
file.diff none

Description Robert Millan 2008-02-23 12:20:01 UTC
This patch adds support to gpt(8) partition editor for BIOS Boot Partition.

This partition type is roughly equivalent to FreeBSD Boot; it is used by GRUB 2 and aimed at standarization.  More details at:

  http://en.wikipedia.org/wiki/BIOS_Boot_Partition_(GPT)

Fix: Patch attached.

Patch attached with submission follows:
Comment 1 Mark Linimon freebsd_committer freebsd_triage 2008-02-23 14:32:55 UTC
Responsible Changed
From-To: freebsd-bugs->marcel

Marcel, can you take a look at this?  If you're not working in this 
area any more, just return it to bugs@.  Thanks.
Comment 2 Marcel Moolenaar freebsd_committer freebsd_triage 2008-11-22 20:50:34 UTC
Responsible Changed
From-To: marcel->bugs

I don't have the bandwidth to work on PC-specific code.
Comment 3 Mark Linimon freebsd_committer freebsd_triage 2008-11-22 20:57:01 UTC
Responsible Changed
From-To: bugs->freebsd-bugs

Canonicalize assignment.
Comment 4 Alexander Best freebsd_committer freebsd_triage 2010-11-13 09:53:15 UTC
Responsible Changed
From-To: freebsd-bugs->freebsd-geom

Assign to freebsd-geom@, since they will have an opinion regarding this issue.
Comment 5 Andriy Gapon freebsd_committer freebsd_triage 2010-11-15 13:57:23 UTC
I think there is no reason not add support for this kind of partition.

Robert,
BTW, just in case, you can create any type of partition using its GUID with gpart.

Andrey,
what do you think?

-- 
Andriy Gapon
Comment 6 Andrey V. Elsukov 2010-11-15 15:11:29 UTC
On 15.11.2010 16:57, Andriy Gapon wrote:
> 
> I think there is no reason not add support for this kind of partition.
> 
> Robert,
> BTW, just in case, you can create any type of partition using its GUID with gpart.
> 
> Andrey,
> what do you think?


1. This patch is for deprecated now gpt(8).
2. Without corresponding support in pmbr and boot code it
will be only cosmetic change.

-- 
WBR, Andrey V. Elsukov
Comment 7 Andriy Gapon freebsd_committer freebsd_triage 2010-11-15 15:46:47 UTC
on 15/11/2010 17:11 Andrey V. Elsukov said the following:
> On 15.11.2010 16:57, Andriy Gapon wrote:
>>
>> I think there is no reason not add support for this kind of partition.
>>
>> Robert,
>> BTW, just in case, you can create any type of partition using its GUID with gpart.
>>
>> Andrey,
>> what do you think?
> 
> 1. This patch is for deprecated now gpt(8).

Oh, I didn't notice that, sorry.

> 2. Without corresponding support in pmbr and boot code it
> will be only cosmetic change.

I think that it would still be useful when using an alternative boot-chain.
I think that this request comes from Debian GNU/kFreeBSD project, which does use
different boot blocks.

-- 
Andriy Gapon
Comment 8 dfilter service freebsd_committer freebsd_triage 2011-01-28 11:13:07 UTC
Author: ae
Date: Fri Jan 28 11:13:01 2011
New Revision: 218014
URL: http://svn.freebsd.org/changeset/base/218014

Log:
  Add new user-friendly aliases for partition types for the MBR and
  EBR schemes: fat32, ebr, linux-data, linux-raid, linux-swap and
  linux-lvm. Add bios-boot GUID and alias for the GPT scheme. It used by
  GRUB 2 loader. Also do sorting definitions of types in diskmbr.h
  and in g_part.c.
  
  PR:		bin/120990, kern/147664
  MFC after:	2 weeks

Modified:
  head/sys/geom/part/g_part.c
  head/sys/geom/part/g_part.h
  head/sys/geom/part/g_part_ebr.c
  head/sys/geom/part/g_part_gpt.c
  head/sys/geom/part/g_part_mbr.c
  head/sys/sys/diskmbr.h
  head/sys/sys/gpt.h

Modified: head/sys/geom/part/g_part.c
==============================================================================
--- head/sys/geom/part/g_part.c	Fri Jan 28 08:57:58 2011	(r218013)
+++ head/sys/geom/part/g_part.c	Fri Jan 28 11:13:01 2011	(r218014)
@@ -76,7 +76,10 @@ struct g_part_alias_list {
 	{ "apple-raid-offline", G_PART_ALIAS_APPLE_RAID_OFFLINE },
 	{ "apple-tv-recovery", G_PART_ALIAS_APPLE_TV_RECOVERY },
 	{ "apple-ufs", G_PART_ALIAS_APPLE_UFS },
+	{ "bios-boot", G_PART_ALIAS_BIOS_BOOT },
+	{ "ebr", G_PART_ALIAS_EBR },
 	{ "efi", G_PART_ALIAS_EFI },
+	{ "fat32", G_PART_ALIAS_MS_FAT32 },
 	{ "freebsd", G_PART_ALIAS_FREEBSD },
 	{ "freebsd-boot", G_PART_ALIAS_FREEBSD_BOOT },
 	{ "freebsd-swap", G_PART_ALIAS_FREEBSD_SWAP },
@@ -87,6 +90,7 @@ struct g_part_alias_list {
 	{ "linux-lvm", G_PART_ALIAS_LINUX_LVM },
 	{ "linux-raid", G_PART_ALIAS_LINUX_RAID },
 	{ "linux-swap", G_PART_ALIAS_LINUX_SWAP },
+	{ "mbr", G_PART_ALIAS_MBR },
 	{ "ms-basic-data", G_PART_ALIAS_MS_BASIC_DATA },
 	{ "ms-ldm-data", G_PART_ALIAS_MS_LDM_DATA },
 	{ "ms-ldm-metadata", G_PART_ALIAS_MS_LDM_METADATA },
@@ -98,7 +102,6 @@ struct g_part_alias_list {
 	{ "netbsd-lfs", G_PART_ALIAS_NETBSD_LFS },
 	{ "netbsd-raid", G_PART_ALIAS_NETBSD_RAID },
 	{ "netbsd-swap", G_PART_ALIAS_NETBSD_SWAP },
-	{ "mbr", G_PART_ALIAS_MBR }
 };
 
 /*

Modified: head/sys/geom/part/g_part.h
==============================================================================
--- head/sys/geom/part/g_part.h	Fri Jan 28 08:57:58 2011	(r218013)
+++ head/sys/geom/part/g_part.h	Fri Jan 28 11:13:01 2011	(r218014)
@@ -66,6 +66,9 @@ enum g_part_alias {
 	G_PART_ALIAS_NETBSD_RAID,	/* A NetBSD RAID partition entry. */
 	G_PART_ALIAS_NETBSD_SWAP,	/* A NetBSD swap partition entry. */
 	G_PART_ALIAS_NETBSD_LFS,	/* A NetBSD LFS partition entry. */
+	G_PART_ALIAS_EBR,		/* A EBR partition entry. */
+	G_PART_ALIAS_MS_FAT32,		/* A Microsoft FAT32 partition entry. */
+	G_PART_ALIAS_BIOS_BOOT,		/* A GRUB 2 boot partition entry. */
 	/* Keep the following last */
 	G_PART_ALIAS_COUNT
 };

Modified: head/sys/geom/part/g_part_ebr.c
==============================================================================
--- head/sys/geom/part/g_part_ebr.c	Fri Jan 28 08:57:58 2011	(r218013)
+++ head/sys/geom/part/g_part_ebr.c	Fri Jan 28 11:13:01 2011	(r218014)
@@ -113,6 +113,19 @@ static struct g_part_scheme g_part_ebr_s
 };
 G_PART_SCHEME_DECLARE(g_part_ebr);
 
+static struct g_part_ebr_alias {
+	u_char		typ;
+	int		alias;
+} ebr_alias_match[] = {
+	{ DOSPTYP_386BSD,	G_PART_ALIAS_FREEBSD },
+	{ DOSPTYP_NTFS,		G_PART_ALIAS_MS_NTFS },
+	{ DOSPTYP_FAT32,	G_PART_ALIAS_MS_FAT32 },
+	{ DOSPTYP_LINSWP,	G_PART_ALIAS_LINUX_SWAP },
+	{ DOSPTYP_LINUX,	G_PART_ALIAS_LINUX_DATA },
+	{ DOSPTYP_LINLVM,	G_PART_ALIAS_LINUX_LVM },
+	{ DOSPTYP_LINRAID,	G_PART_ALIAS_LINUX_RAID },
+};
+
 static void ebr_set_chs(struct g_part_table *, uint32_t, u_char *, u_char *,
     u_char *);
 
@@ -152,6 +165,7 @@ ebr_parse_type(const char *type, u_char 
 	const char *alias;
 	char *endp;
 	long lt;
+	int i;
 
 	if (type[0] == '!') {
 		lt = strtol(type + 1, &endp, 0);
@@ -160,14 +174,18 @@ ebr_parse_type(const char *type, u_char 
 		*dp_typ = (u_char)lt;
 		return (0);
 	}
-	alias = g_part_alias_name(G_PART_ALIAS_FREEBSD);
-	if (!strcasecmp(type, alias)) {
-		*dp_typ = DOSPTYP_386BSD;
-		return (0);
+	for (i = 0;
+	    i < sizeof(ebr_alias_match) / sizeof(ebr_alias_match[0]); i++) {
+		alias = g_part_alias_name(ebr_alias_match[i].alias);
+		if (strcasecmp(type, alias) == 0) {
+			*dp_typ = ebr_alias_match[i].typ;
+			return (0);
+		}
 	}
 	return (EINVAL);
 }
 
+
 static void
 ebr_set_chs(struct g_part_table *table, uint32_t lba, u_char *cylp, u_char *hdp,
     u_char *secp)
@@ -543,13 +561,15 @@ g_part_ebr_type(struct g_part_table *bas
     char *buf, size_t bufsz)
 {
 	struct g_part_ebr_entry *entry;
-	int type;
+	int i;
 
 	entry = (struct g_part_ebr_entry *)baseentry;
-	type = entry->ent.dp_typ;
-	if (type == DOSPTYP_386BSD)
-		return (g_part_alias_name(G_PART_ALIAS_FREEBSD));
-	snprintf(buf, bufsz, "!%d", type);
+	for (i = 0;
+	    i < sizeof(ebr_alias_match) / sizeof(ebr_alias_match[0]); i++) {
+		if (ebr_alias_match[i].typ == entry->ent.dp_typ)
+			return (g_part_alias_name(ebr_alias_match[i].alias));
+	}
+	snprintf(buf, bufsz, "!%d", entry->ent.dp_typ);
 	return (buf);
 }
 

Modified: head/sys/geom/part/g_part_gpt.c
==============================================================================
--- head/sys/geom/part/g_part_gpt.c	Fri Jan 28 08:57:58 2011	(r218013)
+++ head/sys/geom/part/g_part_gpt.c	Fri Jan 28 11:13:01 2011	(r218014)
@@ -146,6 +146,7 @@ static struct uuid gpt_uuid_apple_raid =
 static struct uuid gpt_uuid_apple_raid_offline = GPT_ENT_TYPE_APPLE_RAID_OFFLINE;
 static struct uuid gpt_uuid_apple_tv_recovery = GPT_ENT_TYPE_APPLE_TV_RECOVERY;
 static struct uuid gpt_uuid_apple_ufs = GPT_ENT_TYPE_APPLE_UFS;
+static struct uuid gpt_uuid_bios_boot = GPT_ENT_TYPE_BIOS_BOOT;
 static struct uuid gpt_uuid_efi = GPT_ENT_TYPE_EFI;
 static struct uuid gpt_uuid_freebsd = GPT_ENT_TYPE_FREEBSD;
 static struct uuid gpt_uuid_freebsd_boot = GPT_ENT_TYPE_FREEBSD_BOOT;
@@ -181,6 +182,7 @@ static struct g_part_uuid_alias {
 	{ &gpt_uuid_apple_raid_offline,	G_PART_ALIAS_APPLE_RAID_OFFLINE },
 	{ &gpt_uuid_apple_tv_recovery,	G_PART_ALIAS_APPLE_TV_RECOVERY },
 	{ &gpt_uuid_apple_ufs,		G_PART_ALIAS_APPLE_UFS },
+	{ &gpt_uuid_bios_boot,		G_PART_ALIAS_BIOS_BOOT },
 	{ &gpt_uuid_efi, 		G_PART_ALIAS_EFI },
 	{ &gpt_uuid_freebsd,		G_PART_ALIAS_FREEBSD },
 	{ &gpt_uuid_freebsd_boot, 	G_PART_ALIAS_FREEBSD_BOOT },

Modified: head/sys/geom/part/g_part_mbr.c
==============================================================================
--- head/sys/geom/part/g_part_mbr.c	Fri Jan 28 08:57:58 2011	(r218013)
+++ head/sys/geom/part/g_part_mbr.c	Fri Jan 28 11:13:01 2011	(r218014)
@@ -108,12 +108,27 @@ static struct g_part_scheme g_part_mbr_s
 };
 G_PART_SCHEME_DECLARE(g_part_mbr);
 
+static struct g_part_mbr_alias {
+	u_char		typ;
+	int		alias;
+} mbr_alias_match[] = {
+	{ DOSPTYP_386BSD,	G_PART_ALIAS_FREEBSD },
+	{ DOSPTYP_EXT,		G_PART_ALIAS_EBR },
+	{ DOSPTYP_NTFS,		G_PART_ALIAS_MS_NTFS },
+	{ DOSPTYP_FAT32,	G_PART_ALIAS_MS_FAT32 },
+	{ DOSPTYP_LINSWP,	G_PART_ALIAS_LINUX_SWAP },
+	{ DOSPTYP_LINUX,	G_PART_ALIAS_LINUX_DATA },
+	{ DOSPTYP_LINLVM,	G_PART_ALIAS_LINUX_LVM },
+	{ DOSPTYP_LINRAID,	G_PART_ALIAS_LINUX_RAID },
+};
+
 static int
 mbr_parse_type(const char *type, u_char *dp_typ)
 {
 	const char *alias;
 	char *endp;
 	long lt;
+	int i;
 
 	if (type[0] == '!') {
 		lt = strtol(type + 1, &endp, 0);
@@ -122,15 +137,13 @@ mbr_parse_type(const char *type, u_char 
 		*dp_typ = (u_char)lt;
 		return (0);
 	}
-	alias = g_part_alias_name(G_PART_ALIAS_FREEBSD);
-	if (!strcasecmp(type, alias)) {
-		*dp_typ = DOSPTYP_386BSD;
-		return (0);
-	}
-	alias = g_part_alias_name(G_PART_ALIAS_MS_NTFS);
-	if (!strcasecmp(type, alias)) {
-		*dp_typ = DOSPTYP_NTFS;
-		return (0);
+	for (i = 0;
+	    i < sizeof(mbr_alias_match) / sizeof(mbr_alias_match[0]); i++) {
+		alias = g_part_alias_name(mbr_alias_match[i].alias);
+		if (strcasecmp(type, alias) == 0) {
+			*dp_typ = mbr_alias_match[i].typ;
+			return (0);
+		}
 	}
 	return (EINVAL);
 }
@@ -505,18 +518,15 @@ g_part_mbr_type(struct g_part_table *bas
     char *buf, size_t bufsz)
 {
 	struct g_part_mbr_entry *entry;
-	int type;
+	int i;
 
 	entry = (struct g_part_mbr_entry *)baseentry;
-	type = entry->ent.dp_typ;
-	switch (type) {
-	case DOSPTYP_386BSD:
-		return (g_part_alias_name(G_PART_ALIAS_FREEBSD));
-	case DOSPTYP_NTFS:
-		return (g_part_alias_name(G_PART_ALIAS_MS_NTFS));
-	default:
-		snprintf(buf, bufsz, "!%d", type);
+	for (i = 0;
+	    i < sizeof(mbr_alias_match) / sizeof(mbr_alias_match[0]); i++) {
+		if (mbr_alias_match[i].typ == entry->ent.dp_typ)
+			return (g_part_alias_name(mbr_alias_match[i].alias));
 	}
+	snprintf(buf, bufsz, "!%d", entry->ent.dp_typ);
 	return (buf);
 }
 

Modified: head/sys/sys/diskmbr.h
==============================================================================
--- head/sys/sys/diskmbr.h	Fri Jan 28 08:57:58 2011	(r218013)
+++ head/sys/sys/diskmbr.h	Fri Jan 28 11:13:01 2011	(r218014)
@@ -43,13 +43,16 @@
 #define	DOSMAGICOFFSET	510
 #define	DOSMAGIC	0xAA55
 
+#define	DOSPTYP_EXT	0x05	/* DOS extended partition */
+#define	DOSPTYP_NTFS	0x07	/* NTFS partition */
+#define	DOSPTYP_FAT32	0x0b	/* FAT32 partition */
+#define	DOSPTYP_EXTLBA	0x0f	/* DOS extended partition */
 #define	DOSPTYP_386BSD	0xa5	/* 386BSD partition type */
 #define	DOSPTYP_LINSWP	0x82	/* Linux swap partition */
 #define	DOSPTYP_LINUX	0x83	/* Linux partition */
+#define	DOSPTYP_LINLVM	0x8e	/* Linux LVM partition */
 #define	DOSPTYP_PMBR	0xee	/* GPT Protective MBR */
-#define	DOSPTYP_EXT	5	/* DOS extended partition */
-#define	DOSPTYP_EXTLBA	15	/* DOS extended partition */
-#define	DOSPTYP_NTFS	0x07	/* NTFS partition */
+#define	DOSPTYP_LINRAID	0xfd	/* Linux raid partition */
 
 struct dos_partition {
 	unsigned char	dp_flag;	/* bootstrap flags */

Modified: head/sys/sys/gpt.h
==============================================================================
--- head/sys/sys/gpt.h	Fri Jan 28 08:57:58 2011	(r218013)
+++ head/sys/sys/gpt.h	Fri Jan 28 11:13:01 2011	(r218014)
@@ -150,4 +150,10 @@ struct gpt_ent {
 #define	GPT_ENT_TYPE_NETBSD_CGD		\
 	{0x2db519ec,0xb10f,0x11dc,0xb9,0x9b,{0x00,0x19,0xd1,0x87,0x96,0x48}}
 
+/*
+ * Boot partition used by GRUB 2.
+ */
+#define	GPT_ENT_TYPE_BIOS_BOOT		\
+	{0x21686148,0x6449,0x6e6f,0x74,0x4e,{0x65,0x65,0x64,0x45,0x46,0x49}}
+
 #endif /* _SYS_GPT_H_ */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 9 Andrey V. Elsukov freebsd_committer freebsd_triage 2011-01-28 11:13:32 UTC
Responsible Changed
From-To: freebsd-geom->ae

Take it.
Comment 10 Andrey V. Elsukov freebsd_committer freebsd_triage 2011-01-31 11:44:11 UTC
State Changed
From-To: open->patched

Patched in head/.
Comment 11 dfilter service freebsd_committer freebsd_triage 2011-02-11 05:37:13 UTC
Author: ae
Date: Fri Feb 11 05:37:05 2011
New Revision: 218536
URL: http://svn.freebsd.org/changeset/base/218536

Log:
  MFC r218014:
    Add new user-friendly aliases for partition types for the MBR and
    EBR schemes: fat32, ebr, linux-data, linux-raid, linux-swap and
    linux-lvm. Add bios-boot GUID and alias for the GPT scheme. It used by
    GRUB 2 loader. Also do sorting definitions of types in diskmbr.h
    and in g_part.c.
  
    PR:		bin/120990, kern/147664

Modified:
  stable/8/sys/geom/part/g_part.c
  stable/8/sys/geom/part/g_part.h
  stable/8/sys/geom/part/g_part_ebr.c
  stable/8/sys/geom/part/g_part_gpt.c
  stable/8/sys/geom/part/g_part_mbr.c
  stable/8/sys/sys/diskmbr.h
  stable/8/sys/sys/gpt.h
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/geom/part/g_part.c
==============================================================================
--- stable/8/sys/geom/part/g_part.c	Fri Feb 11 05:33:35 2011	(r218535)
+++ stable/8/sys/geom/part/g_part.c	Fri Feb 11 05:37:05 2011	(r218536)
@@ -76,7 +76,10 @@ struct g_part_alias_list {
 	{ "apple-raid-offline", G_PART_ALIAS_APPLE_RAID_OFFLINE },
 	{ "apple-tv-recovery", G_PART_ALIAS_APPLE_TV_RECOVERY },
 	{ "apple-ufs", G_PART_ALIAS_APPLE_UFS },
+	{ "bios-boot", G_PART_ALIAS_BIOS_BOOT },
+	{ "ebr", G_PART_ALIAS_EBR },
 	{ "efi", G_PART_ALIAS_EFI },
+	{ "fat32", G_PART_ALIAS_MS_FAT32 },
 	{ "freebsd", G_PART_ALIAS_FREEBSD },
 	{ "freebsd-boot", G_PART_ALIAS_FREEBSD_BOOT },
 	{ "freebsd-swap", G_PART_ALIAS_FREEBSD_SWAP },
@@ -87,6 +90,7 @@ struct g_part_alias_list {
 	{ "linux-lvm", G_PART_ALIAS_LINUX_LVM },
 	{ "linux-raid", G_PART_ALIAS_LINUX_RAID },
 	{ "linux-swap", G_PART_ALIAS_LINUX_SWAP },
+	{ "mbr", G_PART_ALIAS_MBR },
 	{ "ms-basic-data", G_PART_ALIAS_MS_BASIC_DATA },
 	{ "ms-ldm-data", G_PART_ALIAS_MS_LDM_DATA },
 	{ "ms-ldm-metadata", G_PART_ALIAS_MS_LDM_METADATA },
@@ -98,7 +102,6 @@ struct g_part_alias_list {
 	{ "netbsd-lfs", G_PART_ALIAS_NETBSD_LFS },
 	{ "netbsd-raid", G_PART_ALIAS_NETBSD_RAID },
 	{ "netbsd-swap", G_PART_ALIAS_NETBSD_SWAP },
-	{ "mbr", G_PART_ALIAS_MBR }
 };
 
 /*

Modified: stable/8/sys/geom/part/g_part.h
==============================================================================
--- stable/8/sys/geom/part/g_part.h	Fri Feb 11 05:33:35 2011	(r218535)
+++ stable/8/sys/geom/part/g_part.h	Fri Feb 11 05:37:05 2011	(r218536)
@@ -66,6 +66,9 @@ enum g_part_alias {
 	G_PART_ALIAS_NETBSD_RAID,	/* A NetBSD RAID partition entry. */
 	G_PART_ALIAS_NETBSD_SWAP,	/* A NetBSD swap partition entry. */
 	G_PART_ALIAS_NETBSD_LFS,	/* A NetBSD LFS partition entry. */
+	G_PART_ALIAS_EBR,		/* A EBR partition entry. */
+	G_PART_ALIAS_MS_FAT32,		/* A Microsoft FAT32 partition entry. */
+	G_PART_ALIAS_BIOS_BOOT,		/* A GRUB 2 boot partition entry. */
 	/* Keep the following last */
 	G_PART_ALIAS_COUNT
 };

Modified: stable/8/sys/geom/part/g_part_ebr.c
==============================================================================
--- stable/8/sys/geom/part/g_part_ebr.c	Fri Feb 11 05:33:35 2011	(r218535)
+++ stable/8/sys/geom/part/g_part_ebr.c	Fri Feb 11 05:37:05 2011	(r218536)
@@ -113,6 +113,19 @@ static struct g_part_scheme g_part_ebr_s
 };
 G_PART_SCHEME_DECLARE(g_part_ebr);
 
+static struct g_part_ebr_alias {
+	u_char		typ;
+	int		alias;
+} ebr_alias_match[] = {
+	{ DOSPTYP_386BSD,	G_PART_ALIAS_FREEBSD },
+	{ DOSPTYP_NTFS,		G_PART_ALIAS_MS_NTFS },
+	{ DOSPTYP_FAT32,	G_PART_ALIAS_MS_FAT32 },
+	{ DOSPTYP_LINSWP,	G_PART_ALIAS_LINUX_SWAP },
+	{ DOSPTYP_LINUX,	G_PART_ALIAS_LINUX_DATA },
+	{ DOSPTYP_LINLVM,	G_PART_ALIAS_LINUX_LVM },
+	{ DOSPTYP_LINRAID,	G_PART_ALIAS_LINUX_RAID },
+};
+
 static void ebr_set_chs(struct g_part_table *, uint32_t, u_char *, u_char *,
     u_char *);
 
@@ -152,6 +165,7 @@ ebr_parse_type(const char *type, u_char 
 	const char *alias;
 	char *endp;
 	long lt;
+	int i;
 
 	if (type[0] == '!') {
 		lt = strtol(type + 1, &endp, 0);
@@ -160,14 +174,18 @@ ebr_parse_type(const char *type, u_char 
 		*dp_typ = (u_char)lt;
 		return (0);
 	}
-	alias = g_part_alias_name(G_PART_ALIAS_FREEBSD);
-	if (!strcasecmp(type, alias)) {
-		*dp_typ = DOSPTYP_386BSD;
-		return (0);
+	for (i = 0;
+	    i < sizeof(ebr_alias_match) / sizeof(ebr_alias_match[0]); i++) {
+		alias = g_part_alias_name(ebr_alias_match[i].alias);
+		if (strcasecmp(type, alias) == 0) {
+			*dp_typ = ebr_alias_match[i].typ;
+			return (0);
+		}
 	}
 	return (EINVAL);
 }
 
+
 static void
 ebr_set_chs(struct g_part_table *table, uint32_t lba, u_char *cylp, u_char *hdp,
     u_char *secp)
@@ -537,13 +555,15 @@ g_part_ebr_type(struct g_part_table *bas
     char *buf, size_t bufsz)
 {
 	struct g_part_ebr_entry *entry;
-	int type;
+	int i;
 
 	entry = (struct g_part_ebr_entry *)baseentry;
-	type = entry->ent.dp_typ;
-	if (type == DOSPTYP_386BSD)
-		return (g_part_alias_name(G_PART_ALIAS_FREEBSD));
-	snprintf(buf, bufsz, "!%d", type);
+	for (i = 0;
+	    i < sizeof(ebr_alias_match) / sizeof(ebr_alias_match[0]); i++) {
+		if (ebr_alias_match[i].typ == entry->ent.dp_typ)
+			return (g_part_alias_name(ebr_alias_match[i].alias));
+	}
+	snprintf(buf, bufsz, "!%d", entry->ent.dp_typ);
 	return (buf);
 }
 

Modified: stable/8/sys/geom/part/g_part_gpt.c
==============================================================================
--- stable/8/sys/geom/part/g_part_gpt.c	Fri Feb 11 05:33:35 2011	(r218535)
+++ stable/8/sys/geom/part/g_part_gpt.c	Fri Feb 11 05:37:05 2011	(r218536)
@@ -146,6 +146,7 @@ static struct uuid gpt_uuid_apple_raid =
 static struct uuid gpt_uuid_apple_raid_offline = GPT_ENT_TYPE_APPLE_RAID_OFFLINE;
 static struct uuid gpt_uuid_apple_tv_recovery = GPT_ENT_TYPE_APPLE_TV_RECOVERY;
 static struct uuid gpt_uuid_apple_ufs = GPT_ENT_TYPE_APPLE_UFS;
+static struct uuid gpt_uuid_bios_boot = GPT_ENT_TYPE_BIOS_BOOT;
 static struct uuid gpt_uuid_efi = GPT_ENT_TYPE_EFI;
 static struct uuid gpt_uuid_freebsd = GPT_ENT_TYPE_FREEBSD;
 static struct uuid gpt_uuid_freebsd_boot = GPT_ENT_TYPE_FREEBSD_BOOT;
@@ -181,6 +182,7 @@ static struct g_part_uuid_alias {
 	{ &gpt_uuid_apple_raid_offline,	G_PART_ALIAS_APPLE_RAID_OFFLINE },
 	{ &gpt_uuid_apple_tv_recovery,	G_PART_ALIAS_APPLE_TV_RECOVERY },
 	{ &gpt_uuid_apple_ufs,		G_PART_ALIAS_APPLE_UFS },
+	{ &gpt_uuid_bios_boot,		G_PART_ALIAS_BIOS_BOOT },
 	{ &gpt_uuid_efi, 		G_PART_ALIAS_EFI },
 	{ &gpt_uuid_freebsd,		G_PART_ALIAS_FREEBSD },
 	{ &gpt_uuid_freebsd_boot, 	G_PART_ALIAS_FREEBSD_BOOT },

Modified: stable/8/sys/geom/part/g_part_mbr.c
==============================================================================
--- stable/8/sys/geom/part/g_part_mbr.c	Fri Feb 11 05:33:35 2011	(r218535)
+++ stable/8/sys/geom/part/g_part_mbr.c	Fri Feb 11 05:37:05 2011	(r218536)
@@ -108,12 +108,27 @@ static struct g_part_scheme g_part_mbr_s
 };
 G_PART_SCHEME_DECLARE(g_part_mbr);
 
+static struct g_part_mbr_alias {
+	u_char		typ;
+	int		alias;
+} mbr_alias_match[] = {
+	{ DOSPTYP_386BSD,	G_PART_ALIAS_FREEBSD },
+	{ DOSPTYP_EXT,		G_PART_ALIAS_EBR },
+	{ DOSPTYP_NTFS,		G_PART_ALIAS_MS_NTFS },
+	{ DOSPTYP_FAT32,	G_PART_ALIAS_MS_FAT32 },
+	{ DOSPTYP_LINSWP,	G_PART_ALIAS_LINUX_SWAP },
+	{ DOSPTYP_LINUX,	G_PART_ALIAS_LINUX_DATA },
+	{ DOSPTYP_LINLVM,	G_PART_ALIAS_LINUX_LVM },
+	{ DOSPTYP_LINRAID,	G_PART_ALIAS_LINUX_RAID },
+};
+
 static int
 mbr_parse_type(const char *type, u_char *dp_typ)
 {
 	const char *alias;
 	char *endp;
 	long lt;
+	int i;
 
 	if (type[0] == '!') {
 		lt = strtol(type + 1, &endp, 0);
@@ -122,15 +137,13 @@ mbr_parse_type(const char *type, u_char 
 		*dp_typ = (u_char)lt;
 		return (0);
 	}
-	alias = g_part_alias_name(G_PART_ALIAS_FREEBSD);
-	if (!strcasecmp(type, alias)) {
-		*dp_typ = DOSPTYP_386BSD;
-		return (0);
-	}
-	alias = g_part_alias_name(G_PART_ALIAS_MS_NTFS);
-	if (!strcasecmp(type, alias)) {
-		*dp_typ = DOSPTYP_NTFS;
-		return (0);
+	for (i = 0;
+	    i < sizeof(mbr_alias_match) / sizeof(mbr_alias_match[0]); i++) {
+		alias = g_part_alias_name(mbr_alias_match[i].alias);
+		if (strcasecmp(type, alias) == 0) {
+			*dp_typ = mbr_alias_match[i].typ;
+			return (0);
+		}
 	}
 	return (EINVAL);
 }
@@ -511,18 +524,15 @@ g_part_mbr_type(struct g_part_table *bas
     char *buf, size_t bufsz)
 {
 	struct g_part_mbr_entry *entry;
-	int type;
+	int i;
 
 	entry = (struct g_part_mbr_entry *)baseentry;
-	type = entry->ent.dp_typ;
-	switch (type) {
-	case DOSPTYP_386BSD:
-		return (g_part_alias_name(G_PART_ALIAS_FREEBSD));
-	case DOSPTYP_NTFS:
-		return (g_part_alias_name(G_PART_ALIAS_MS_NTFS));
-	default:
-		snprintf(buf, bufsz, "!%d", type);
+	for (i = 0;
+	    i < sizeof(mbr_alias_match) / sizeof(mbr_alias_match[0]); i++) {
+		if (mbr_alias_match[i].typ == entry->ent.dp_typ)
+			return (g_part_alias_name(mbr_alias_match[i].alias));
 	}
+	snprintf(buf, bufsz, "!%d", entry->ent.dp_typ);
 	return (buf);
 }
 

Modified: stable/8/sys/sys/diskmbr.h
==============================================================================
--- stable/8/sys/sys/diskmbr.h	Fri Feb 11 05:33:35 2011	(r218535)
+++ stable/8/sys/sys/diskmbr.h	Fri Feb 11 05:37:05 2011	(r218536)
@@ -43,13 +43,16 @@
 #define	DOSMAGICOFFSET	510
 #define	DOSMAGIC	0xAA55
 
+#define	DOSPTYP_EXT	0x05	/* DOS extended partition */
+#define	DOSPTYP_NTFS	0x07	/* NTFS partition */
+#define	DOSPTYP_FAT32	0x0b	/* FAT32 partition */
+#define	DOSPTYP_EXTLBA	0x0f	/* DOS extended partition */
 #define	DOSPTYP_386BSD	0xa5	/* 386BSD partition type */
 #define	DOSPTYP_LINSWP	0x82	/* Linux swap partition */
 #define	DOSPTYP_LINUX	0x83	/* Linux partition */
+#define	DOSPTYP_LINLVM	0x8e	/* Linux LVM partition */
 #define	DOSPTYP_PMBR	0xee	/* GPT Protective MBR */
-#define	DOSPTYP_EXT	5	/* DOS extended partition */
-#define	DOSPTYP_EXTLBA	15	/* DOS extended partition */
-#define	DOSPTYP_NTFS	0x07	/* NTFS partition */
+#define	DOSPTYP_LINRAID	0xfd	/* Linux raid partition */
 
 struct dos_partition {
 	unsigned char	dp_flag;	/* bootstrap flags */

Modified: stable/8/sys/sys/gpt.h
==============================================================================
--- stable/8/sys/sys/gpt.h	Fri Feb 11 05:33:35 2011	(r218535)
+++ stable/8/sys/sys/gpt.h	Fri Feb 11 05:37:05 2011	(r218536)
@@ -150,4 +150,10 @@ struct gpt_ent {
 #define	GPT_ENT_TYPE_NETBSD_CGD		\
 	{0x2db519ec,0xb10f,0x11dc,0xb9,0x9b,{0x00,0x19,0xd1,0x87,0x96,0x48}}
 
+/*
+ * Boot partition used by GRUB 2.
+ */
+#define	GPT_ENT_TYPE_BIOS_BOOT		\
+	{0x21686148,0x6449,0x6e6f,0x74,0x4e,{0x65,0x65,0x64,0x45,0x46,0x49}}
+
 #endif /* _SYS_GPT_H_ */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 12 Andrey V. Elsukov freebsd_committer freebsd_triage 2011-02-11 05:57:10 UTC
State Changed
From-To: patched->closed

Merged to stable/8.