diff options
-rw-r--r-- | extras/volume_id/lib/Makefile | 4 | ||||
-rw-r--r-- | extras/volume_id/lib/adaptec_raid.c | 112 | ||||
-rw-r--r-- | extras/volume_id/lib/jmicron_raid.c | 62 | ||||
-rw-r--r-- | extras/volume_id/lib/libvolume_id.h | 2 | ||||
-rw-r--r-- | extras/volume_id/lib/volume_id.c | 6 |
5 files changed, 185 insertions, 1 deletions
diff --git a/extras/volume_id/lib/Makefile b/extras/volume_id/lib/Makefile index e847f36bc6..8d8710d09a 100644 --- a/extras/volume_id/lib/Makefile +++ b/extras/volume_id/lib/Makefile @@ -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 index 0000000000..858c3ba09e --- /dev/null +++ b/extras/volume_id/lib/adaptec_raid.c @@ -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 index 0000000000..5182a3e825 --- /dev/null +++ b/extras/volume_id/lib/jmicron_raid.c @@ -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; +} diff --git a/extras/volume_id/lib/libvolume_id.h b/extras/volume_id/lib/libvolume_id.h index d6c5536274..df9fcd9891 100644 --- a/extras/volume_id/lib/libvolume_id.h +++ b/extras/volume_id/lib/libvolume_id.h @@ -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 diff --git a/extras/volume_id/lib/volume_id.c b/extras/volume_id/lib/volume_id.c index 50eb72dbd5..fd95e7d3b0 100644 --- a/extras/volume_id/lib/volume_id.c +++ b/extras/volume_id/lib/volume_id.c @@ -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) |