chiark / gitweb /
volume_id: add DDF support
authorKay Sievers <kay.sievers@vrfy.org>
Fri, 4 May 2007 14:54:46 +0000 (16:54 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Fri, 4 May 2007 14:54:46 +0000 (16:54 +0200)
extras/volume_id/lib/Makefile
extras/volume_id/lib/ddf_raid.c [new file with mode: 0644]
extras/volume_id/lib/exported_symbols
extras/volume_id/lib/libvolume_id.h

index 5618b96a51f739de2d840fdd4def79d9352e2daf..b73172e37e5cf03ae36e1e062d709e1c672e4858 100644 (file)
@@ -30,6 +30,7 @@ OBJS=                         \
        promise_raid.o          \
        adaptec_raid.o          \
        jmicron_raid.o          \
+       ddf_raid.o              \
        iso9660.o               \
        jfs.o                   \
        linux_raid.o            \
diff --git a/extras/volume_id/lib/ddf_raid.c b/extras/volume_id/lib/ddf_raid.c
new file mode 100644 (file)
index 0000000..9ac5c91
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * volume_id - reads filesystem label and uuid
+ *
+ * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org>
+ *
+ *     This program is free software; you can redistribute it and/or modify it
+ *     under the terms of the GNU General Public License as published by the
+ *     Free Software Foundation version 2 of the License.
+ */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <byteswap.h>
+
+#include "libvolume_id.h"
+#include "util.h"
+
+#define DDF_HEADER                     0xDE11DE11
+#define DDF_GUID_LENGTH                        24
+#define DDF_REV_LENGTH                 8
+
+static struct ddf_header {
+       uint32_t        signature;
+       uint32_t        crc;
+       uint8_t         guid[DDF_GUID_LENGTH];
+       uint8_t         ddf_rev[DDF_REV_LENGTH];
+} PACKED *ddf;
+
+int volume_id_probe_ddf_raid(struct volume_id *id, uint64_t off, uint64_t size)
+{
+       uint64_t ddf_off = ((size / 0x200)-1) * 0x200;
+       const uint8_t *buf;
+
+       info("probing at offset 0x%llx, size 0x%llx",
+           (unsigned long long) off, (unsigned long long) size);
+       if (size < 0x10000)
+               return -1;
+
+       buf = volume_id_get_buffer(id, off + ddf_off, 0x200);
+       if (buf == NULL)
+               return -1;
+       ddf = (struct ddf_header *) buf;
+
+       if (ddf->signature != cpu_to_be32(DDF_HEADER))
+               return -1;
+
+       volume_id_set_uuid(id, ddf->guid, DDF_GUID_LENGTH, UUID_STRING);
+       snprintf(id->type_version, DDF_REV_LENGTH, "%s", ddf->ddf_rev);
+       volume_id_set_usage(id, VOLUME_ID_RAID);
+       id->type = "ddf_raid_member";
+       return 0;
+}
index c88d993e01be9b20e424c1b8e5fd78107e5a90fd..d11634a9483d4e544682c7e0650fbe56a153c825 100644 (file)
@@ -44,6 +44,7 @@
        volume_id_probe_linux_raid;
        volume_id_probe_lvm1;
        volume_id_probe_lvm2;
+       volume_id_probe_ddf_raid;
        volume_id_probe_intel_software_raid;
        volume_id_probe_highpoint_37x_raid;
        volume_id_probe_highpoint_45x_raid;
index 523543f7ee413f8cb925d6b280db6ed22eb4f0df..adfc75cb992d00deb6ad7db08582edd113e92f6e 100644 (file)
@@ -103,6 +103,7 @@ extern int volume_id_probe_luks(struct volume_id *id, uint64_t off, uint64_t siz
 extern int volume_id_probe_linux_raid(struct volume_id *id, uint64_t off, uint64_t size);
 extern int volume_id_probe_lvm1(struct volume_id *id, uint64_t off, uint64_t size);
 extern int volume_id_probe_lvm2(struct volume_id *id, uint64_t off, uint64_t size);
+extern int volume_id_probe_ddf_raid(struct volume_id *id, uint64_t off, uint64_t size);
 
 /* bios raid */
 extern int volume_id_probe_intel_software_raid(struct volume_id *id, uint64_t off, uint64_t size);