chiark / gitweb /
libvolume_id: add more software raid signatures
authorKay Sievers <kay.sievers@suse.de>
Mon, 15 May 2006 19:57:28 +0000 (21:57 +0200)
committerKay Sievers <kay.sievers@suse.de>
Mon, 15 May 2006 19:57:28 +0000 (21:57 +0200)
extras/volume_id/lib/Makefile
extras/volume_id/lib/adaptec_raid.c [new file with mode: 0644]
extras/volume_id/lib/jmicron_raid.c [new file with mode: 0644]
extras/volume_id/lib/libvolume_id.h
extras/volume_id/lib/volume_id.c

index e847f36..8d8710d 100644 (file)
@@ -13,7 +13,7 @@ INSTALL_DATA  = ${INSTALL} -m 644
 INSTALL_LIB = ${INSTALL} -m 755
 
 SHLIB_CUR = 0
-SHLIB_REV = 64
+SHLIB_REV = 65
 SHLIB_AGE = 0
 SHLIB = libvolume_id.so.$(SHLIB_CUR).$(SHLIB_REV).$(SHLIB_AGE)
 
@@ -28,6 +28,8 @@ OBJS=                         \
        silicon_raid.o          \
        nvidia_raid.o           \
        promise_raid.o          \
+       adaptec_raid.o          \
+       jmicron_raid.o          \
        iso9660.o               \
        jfs.o                   \
        linux_raid.o            \
diff --git a/extras/volume_id/lib/adaptec_raid.c b/extras/volume_id/lib/adaptec_raid.c
new file mode 100644 (file)
index 0000000..858c3ba
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * volume_id - reads filesystem label and uuid
+ *
+ * Copyright (C) 2006 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 "libvolume_id.h"
+#include "util.h"
+
+struct adaptec_meta {
+       uint32_t        b0idcode;
+       uint8_t         lunsave[8];
+       uint16_t        sdtype;
+       uint16_t        ssavecyl;
+       uint8_t         ssavehed;
+       uint8_t         ssavesec;
+       uint8_t         sb0flags;
+       uint8_t         jbodEnable;
+       uint8_t         lundsave;
+       uint8_t         svpdirty;
+       uint16_t        biosInfo;
+       uint16_t        svwbskip;
+       uint16_t        svwbcln;
+       uint16_t        svwbmax;
+       uint16_t        res3;
+       uint16_t        svwbmin;
+       uint16_t        res4;
+       uint16_t        svrcacth;
+       uint16_t        svwcacth;
+       uint16_t        svwbdly;
+       uint8_t         svsdtime;
+       uint8_t         res5;
+       uint16_t        firmval;
+       uint16_t        firmbln;
+       uint32_t        firmblk;
+       uint32_t        fstrsvrb;
+       uint16_t        svBlockStorageTid;
+       uint16_t        svtid;
+       uint8_t         svseccfl;
+       uint8_t         res6;
+       uint8_t         svhbanum;
+       uint8_t         resver;
+       uint32_t        drivemagic;
+       uint8_t         reserved[20];
+       uint8_t         testnum;
+       uint8_t         testflags;
+       uint16_t        maxErrorCount;
+       uint32_t        count;
+       uint32_t        startTime;
+       uint32_t        interval;
+       uint8_t         tstxt0;
+       uint8_t         tstxt1;
+       uint8_t         serNum[32];
+       uint8_t         res8[102];
+       uint32_t        fwTestMagic;
+       uint32_t        fwTestSeqNum;
+       uint8_t         fwTestRes[8];
+       uint8_t         smagic[4];
+       uint32_t        raidtbl;
+       uint16_t        raidline;
+       uint8_t         res9[0xF6];
+} PACKED;
+
+int volume_id_probe_adaptec_raid(struct volume_id *id, uint64_t off, uint64_t size)
+{
+       const uint8_t *buf;
+       uint64_t meta_off;
+       struct adaptec_meta *ad;
+
+       info("probing at offset 0x%llx, size 0x%llx",
+           (unsigned long long) off, (unsigned long long) size);
+
+       if (size < 0x10000)
+               return -1;
+
+       meta_off = ((size / 0x200)-1) * 0x200;
+       buf = volume_id_get_buffer(id, off + meta_off, 0x200);
+       if (buf == NULL)
+               return -1;
+
+       ad = (struct adaptec_meta *) buf;
+       if (memcmp(ad->smagic, "DPTM", 4) != 0)
+               return -1;
+
+       if (ad->b0idcode != be32_to_cpu(0x37FC4D1E))
+               return -1;
+
+       volume_id_set_usage(id, VOLUME_ID_RAID);
+       snprintf(id->type_version, sizeof(id->type_version)-1, "%u", ad->resver);
+       id->type = "adaptec_raid_member";
+
+       return 0;
+}
diff --git a/extras/volume_id/lib/jmicron_raid.c b/extras/volume_id/lib/jmicron_raid.c
new file mode 100644 (file)
index 0000000..5182a3e
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * volume_id - reads filesystem label and uuid
+ *
+ * Copyright (C) 2006 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 "libvolume_id.h"
+#include "util.h"
+
+struct jmicron_meta {
+       int8_t          signature[2];
+       uint8_t         minor_version;
+       uint8_t         major_version;
+       uint16_t        checksum;
+} PACKED;
+
+int volume_id_probe_jmicron_raid(struct volume_id *id, uint64_t off, uint64_t size)
+{
+       const uint8_t *buf;
+       uint64_t meta_off;
+       struct jmicron_meta *jm;
+
+       info("probing at offset 0x%llx, size 0x%llx",
+           (unsigned long long) off, (unsigned long long) size);
+
+       if (size < 0x10000)
+               return -1;
+
+       meta_off = ((size / 0x200)-1) * 0x200;
+       buf = volume_id_get_buffer(id, off + meta_off, 0x200);
+       if (buf == NULL)
+               return -1;
+
+       jm = (struct jmicron_meta *) buf;
+       if (memcmp(jm->signature, "JM", 2) != 0)
+               return -1;
+
+       volume_id_set_usage(id, VOLUME_ID_RAID);
+       snprintf(id->type_version, sizeof(id->type_version)-1, "%u.%u", jm->major_version, jm->minor_version);
+       id->type = "jmicron_raid_member";
+
+       return 0;
+}
index d6c5536..df9fcd9 100644 (file)
@@ -108,5 +108,7 @@ extern int volume_id_probe_nvidia_raid(struct volume_id *id, uint64_t off, uint6
 extern int volume_id_probe_promise_fasttrack_raid(struct volume_id *id, uint64_t off, uint64_t size);
 extern int volume_id_probe_silicon_medley_raid(struct volume_id *id, uint64_t off, uint64_t size);
 extern int volume_id_probe_via_raid(struct volume_id *id, uint64_t off, uint64_t size);
+extern int volume_id_probe_adaptec_raid(struct volume_id *id, uint64_t off, uint64_t size);
+extern int volume_id_probe_jmicron_raid(struct volume_id *id, uint64_t off, uint64_t size);
 
 #endif
index 50eb72d..fd95e7d 100644 (file)
@@ -69,6 +69,12 @@ int volume_id_probe_raid(struct volume_id *id, uint64_t off, uint64_t size)
 
                if (volume_id_probe_highpoint_45x_raid(id, off, size) == 0)
                        goto found;
+
+               if (volume_id_probe_adaptec_raid(id, off, size) == 0)
+                       goto found;
+
+               if (volume_id_probe_jmicron_raid(id, off, size) == 0)
+                       goto found;
        }
 
        if (volume_id_probe_lvm1(id, off) == 0)