[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <87vdapkgnk.fsf@violet.siamics.net>
Date: Sat, 15 May 2010 10:06:23 +0700
From: Ivan Shmakov <ivan@...n.uusia.org>
To: linux-ext4@...r.kernel.org
Cc: Ivan Shmakov <oneingray@...il.com>
Subject: Re: [PATCH] libblkid: support for GUID Partition Table (GPT), please?
>>>>> "IS" == Ivan Shmakov <ivan@...n.uusia.org> writes:
IS> GPT contains a supposed to be unique “Disk GUID” field, which
IS> allows for the media bearing such a partition table to be
IS> identified.
IS> May I suggest adding support for GPT to libblkid? An alpha-quality
IS> patch is MIME'd.
Ahem. Wrong copy-paste late at night. Should be better this
time.
For a test:
$ blkid -t TYPE=gpt /dev/sd?
/dev/sdb: UUID="CE050C6F-E7BE-AD46-8FEE-F02476EC767E" TYPE="gpt"
/dev/sdd: UUID="2A1210B5-535F-4A4A-84D0-34ABC6E57FFB" TYPE="gpt"
/dev/sde: UUID="7B0FA8C6-26DD-1840-BBF5-46AD26CA551C" TYPE="gpt"
/dev/sdf: UUID="04DF9DE5-CFDA-514D-99B7-CC61061FCE3C" TYPE="gpt"
$
Please note that the CRC-32 value contained in the GPT is not
checked.
The UUID could be printed in lower case instead.
--
FSF associate member #7257
diff --git a/lib/blkid/probe.c b/lib/blkid/probe.c
index 6b75732..8500320 100644
--- a/lib/blkid/probe.c
+++ b/lib/blkid/probe.c
@@ -1383,6 +1383,33 @@ static int probe_btrfs(struct blkid_probe *probe,
set_uuid(probe->dev, bs->fsid, 0);
return 0;
}
+
+static int probe_gpt (struct blkid_probe *probe,
+ struct blkid_magic *id,
+ unsigned char *buf)
+{
+ struct gpt_header *gh
+ = (struct gpt_header *)(buf + 0x200);
+
+ /* FIXME: check gh->header_crc32 */
+
+ {
+ const __u8 *u = gh->disk_guid;
+ char uuid_str[33];
+
+ sprintf (uuid_str,
+ ("%02X%02X%02X%02X"
+ "-%02X%02X-%02X%02X-%02X%02X"
+ "-%02X%02X%02X%02X%02X%02X"),
+ u[0], u[1], u[2], u[3],
+ u[4], u[5], u[6], u[7], u[8], u[9],
+ u[10], u[11], u[12], u[13], u[14], u[15]);
+ blkid_set_tag (probe->dev, "UUID", uuid_str, 0);
+ }
+
+ return 0;
+}
+
/*
* Various filesystem magics that we can check for. Note that kboff and
* sboff are in kilobytes and bytes respectively. All magics are in
@@ -1482,6 +1509,7 @@ static struct blkid_magic type_array[] = {
{ "lvm2pv", 1, 0x018, 8, "LVM2 001", probe_lvm2 },
{ "lvm2pv", 1, 0x218, 8, "LVM2 001", probe_lvm2 },
{ "btrfs", 64, 0x40, 8, "_BHRfS_M", probe_btrfs },
+ { "gpt", 0, 0x200, 8, "EFI PART", probe_gpt },
{ NULL, 0, 0, 0, NULL, NULL }
};
diff --git a/lib/blkid/probe.h b/lib/blkid/probe.h
index 37fc9c0..4d39b84 100644
--- a/lib/blkid/probe.h
+++ b/lib/blkid/probe.h
@@ -725,6 +725,28 @@ struct btrfs_super_block {
__u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
} __attribute__ ((__packed__));
+struct gpt_header {
+ /* references:
+ * * linux/include/linux/efi.h;
+ * * Wikipedia entry.
+ */
+ __u64 signature;
+ __u32 revision;
+ __u32 header_size;
+ __u32 header_crc32;
+ __u32 reserved1;
+ __u64 my_lba;
+ __u64 alternate_lba;
+ __u64 first_usable_lba;
+ __u64 last_usable_lba;
+ __u8 disk_guid[16];
+ __u64 partition_entry_lba;
+ __u32 num_partition_entries;
+ __u32 sizeof_partition_entry;
+ __u32 partition_entry_array_crc32;
+ __u8 reserved2[512 - 92];
+} __attribute__ ((__packed__));
+
/*
* Byte swap functions
*/
Content of type "application/pgp-signature" skipped
Powered by blists - more mailing lists