Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sbin/gpt - convert FreeBSD FS_<type> to numbers where they d...
details: https://anonhg.NetBSD.org/src/rev/4f1f44d0f060
branches: trunk
changeset: 790669:4f1f44d0f060
user: jnemeth <jnemeth%NetBSD.org@localhost>
date: Sat Oct 19 08:13:21 2013 +0000
description:
- convert FreeBSD FS_<type> to numbers where they don't match NetBSD
- add support for migrating NetBSD disklabel'ed disks (only 7 years late)
- use labels for partition types
diffstat:
sbin/gpt/migrate.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 104 insertions(+), 6 deletions(-)
diffs (159 lines):
diff -r 3f7171363f97 -r 4f1f44d0f060 sbin/gpt/migrate.c
--- a/sbin/gpt/migrate.c Sat Oct 19 08:03:52 2013 +0000
+++ b/sbin/gpt/migrate.c Sat Oct 19 08:13:21 2013 +0000
@@ -29,11 +29,12 @@
__FBSDID("$FreeBSD: src/sbin/gpt/migrate.c,v 1.16 2005/09/01 02:42:52 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: migrate.c,v 1.8 2013/10/19 01:58:33 jnemeth Exp $");
+__RCSID("$NetBSD: migrate.c,v 1.9 2013/10/19 08:13:21 jnemeth Exp $");
#endif
#include <sys/types.h>
#include <sys/param.h>
+#include <sys/bootblock.h>
#include <sys/disklabel.h>
#include <err.h>
@@ -119,14 +120,14 @@
ent->ent_name, 36);
break;
}
- case FS_VINUM: {
+ case 14: { /* Vinum */
static const uuid_t vinum = GPT_ENT_TYPE_FREEBSD_VINUM;
le_uuid_enc(ent->ent_type, &vinum);
utf8_to_utf16((const uint8_t *)"FreeBSD vinum partition",
ent->ent_name, 36);
break;
}
- case FS_ZFS: {
+ case 27: { /* ZFS */
static const uuid_t zfs = GPT_ENT_TYPE_FREEBSD_ZFS;
le_uuid_enc(ent->ent_type, &zfs);
utf8_to_utf16((const uint8_t *)"FreeBSD ZFS partition",
@@ -151,6 +152,100 @@
return (ent);
}
+static struct gpt_ent*
+migrate_netbsd_disklabel(int fd, off_t start, struct gpt_ent *ent)
+{
+ char *buf;
+ struct disklabel *dl;
+ off_t ofs, rawofs;
+ int i;
+
+ buf = gpt_read(fd, start + LABELSECTOR, 1);
+ dl = (void*)(buf + LABELOFFSET);
+
+ if (le32toh(dl->d_magic) != DISKMAGIC ||
+ le32toh(dl->d_magic2) != DISKMAGIC) {
+ warnx("%s: warning: NetBSD slice without disklabel",
+ device_name);
+ return (ent);
+ }
+
+ rawofs = le32toh(dl->d_partitions[RAW_PART].p_offset) *
+ le32toh(dl->d_secsize);
+ for (i = 0; i < le16toh(dl->d_npartitions); i++) {
+ if (dl->d_partitions[i].p_fstype == FS_UNUSED)
+ continue;
+ ofs = le32toh(dl->d_partitions[i].p_offset) *
+ le32toh(dl->d_secsize);
+ if (ofs < rawofs)
+ rawofs = 0;
+ }
+ rawofs /= secsz;
+
+ for (i = 0; i < le16toh(dl->d_npartitions); i++) {
+ switch (dl->d_partitions[i].p_fstype) {
+ case FS_UNUSED:
+ continue;
+ case FS_SWAP: {
+ static const uuid_t swap = GPT_ENT_TYPE_NETBSD_SWAP;
+ le_uuid_enc(ent->ent_type, &swap);
+ utf8_to_utf16((const uint8_t *)"NetBSD swap partition",
+ ent->ent_name, 36);
+ break;
+ }
+ case FS_BSDFFS: {
+ static const uuid_t ufs = GPT_ENT_TYPE_NETBSD_FFS;
+ le_uuid_enc(ent->ent_type, &ufs);
+ utf8_to_utf16((const uint8_t *)"NetBSD FFS partition",
+ ent->ent_name, 36);
+ break;
+ }
+ case FS_BSDLFS: {
+ static const uuid_t zfs = GPT_ENT_TYPE_NETBSD_LFS;
+ le_uuid_enc(ent->ent_type, &zfs);
+ utf8_to_utf16((const uint8_t *)"NetBSD LFS partition",
+ ent->ent_name, 36);
+ break;
+ }
+ case FS_RAID: {
+ static const uuid_t zfs = GPT_ENT_TYPE_NETBSD_RAIDFRAME;
+ le_uuid_enc(ent->ent_type, &zfs);
+ utf8_to_utf16((const uint8_t *)"NetBSD RAIDframe partition",
+ ent->ent_name, 36);
+ break;
+ }
+ case FS_CCD: {
+ static const uuid_t zfs = GPT_ENT_TYPE_NETBSD_CCD;
+ le_uuid_enc(ent->ent_type, &zfs);
+ utf8_to_utf16((const uint8_t *)"NetBSD CCD partition",
+ ent->ent_name, 36);
+ break;
+ }
+ case FS_CGD: {
+ static const uuid_t zfs = GPT_ENT_TYPE_NETBSD_CGD;
+ le_uuid_enc(ent->ent_type, &zfs);
+ utf8_to_utf16((const uint8_t *)"NetBSD CGD partition",
+ ent->ent_name, 36);
+ break;
+ }
+ default:
+ warnx("%s: warning: unknown NetBSD partition (%d)",
+ device_name, dl->d_partitions[i].p_fstype);
+ continue;
+ }
+
+ ofs = (le32toh(dl->d_partitions[i].p_offset) *
+ le32toh(dl->d_secsize)) / secsz;
+ ofs = (ofs > 0) ? ofs - rawofs : 0;
+ ent->ent_lba_start = htole64(start + ofs);
+ ent->ent_lba_end = htole64(start + ofs +
+ le32toh(dl->d_partitions[i].p_size) - 1LL);
+ ent++;
+ }
+
+ return (ent);
+}
+
static void
migrate(int fd)
{
@@ -262,9 +357,9 @@
size = (size << 16) + le16toh(mbr->mbr_part[i].part_size_lo);
switch (mbr->mbr_part[i].part_typ) {
- case 0:
+ case MBR_PTYPE_UNUSED:
continue;
- case 165: { /* FreeBSD */
+ case MBR_PTYPE_386BSD: { /* FreeBSD */
if (slice) {
static const uuid_t freebsd = GPT_ENT_TYPE_FREEBSD;
le_uuid_enc(ent->ent_type, &freebsd);
@@ -277,7 +372,10 @@
ent = migrate_disklabel(fd, start, ent);
break;
}
- case 239: { /* EFI */
+ case MBR_PTYPE_NETBSD:
+ ent = migrate_netbsd_disklabel(fd, start, ent);
+ break;
+ case MBR_PTYPE_EFI: {
static const uuid_t efi_slice = GPT_ENT_TYPE_EFI;
le_uuid_enc(ent->ent_type, &efi_slice);
ent->ent_lba_start = htole64((uint64_t)start);
Home |
Main Index |
Thread Index |
Old Index