]> err.no Git - util-linux/commitdiff
blkid: add VIA RAID
authorKarel Zak <kzak@redhat.com>
Tue, 9 Sep 2008 09:38:39 +0000 (11:38 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 11 Feb 2009 22:21:44 +0000 (23:21 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
libs/blkid/src/probe.c
libs/blkid/src/probers/Makefile.am
libs/blkid/src/probers/probers.h
libs/blkid/src/probers/via_raid.c [new file with mode: 0644]

index ac389873212b732cf635c3dc2c877093240b69d6..4fc3b83eaa2a5f5596fb00aa2bbd9e164b111188 100644 (file)
@@ -45,7 +45,8 @@ static const struct blkid_idinfo *idinfos[] =
        &lsi_idinfo,
        &nvraid_idinfo,
        &pdcraid_idinfo,
-       &silraid_idinfo
+       &silraid_idinfo,
+       &viaraid_idinfo
 };
 
 #ifndef ARRAY_SIZE
index 0b36608e65de5cca6cee46e0cca691a7edb9c664..5a5bf7e5ba28c759a7ff40ea3319cadd3c0e5401 100644 (file)
@@ -14,6 +14,7 @@ libprobers_a_SOURCES =        probers.h \
                        lsi_raid.c \
                        nvidia_raid.c \
                        promise_raid.c \
-                       silicon_raid.c
+                       silicon_raid.c \
+                       via_raid.c
 
 all-local: $(lib_LIBRARIES)
index 10e2aee5166ebc912a073deccb0f487948f9748c..e5313364d0245cbd51e9183db5ac9b40c2c9fa90 100644 (file)
@@ -26,5 +26,6 @@ extern const struct blkid_idinfo lsi_idinfo;
 extern const struct blkid_idinfo nvraid_idinfo;
 extern const struct blkid_idinfo pdcraid_idinfo;
 extern const struct blkid_idinfo silraid_idinfo;
+extern const struct blkid_idinfo viaraid_idinfo;
 
 #endif /* _BLKID_PROBE_H */
diff --git a/libs/blkid/src/probers/via_raid.c b/libs/blkid/src/probers/via_raid.c
new file mode 100644 (file)
index 0000000..2a2557c
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2008 Karel Zak <kzak@redhat.com>
+ * Copyright (C) 2004-2006 Heinz Mauelshagen, Red Hat GmbH
+ *
+ * This file 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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <stdint.h>
+
+#include "blkidP.h"
+
+struct via_meta {
+       uint16_t        signature;
+       uint8_t         version_number;
+       struct via_array {
+               uint16_t        disk_bit_mask;
+               uint8_t         disk_array_ex;
+               uint32_t        capacity_low;
+               uint32_t        capacity_high;
+               uint32_t        serial_checksum;
+       } array;
+       uint32_t        serial_checksum[8];
+       uint8_t         checksum;
+};
+
+#define VIA_SIGNATURE          0xAA55
+
+/* 8 bit checksum on first 50 bytes of metadata. */
+static uint8_t meta_checksum(struct via_meta *via)
+{
+       uint8_t i = 50, sum = 0;
+
+       while (i--)
+               sum += ((uint8_t*) via)[i];
+
+       return sum == via->checksum;
+}
+
+static int probe_viaraid(blkid_probe pr, const struct blkid_idmag *mag)
+{
+       uint64_t meta_off;
+       struct via_meta *via;
+
+       if (pr->size < 0x10000)
+               return -1;
+
+       meta_off = ((pr->size / 0x200)-1) * 0x200;
+
+       via = (struct via_meta *) blkid_probe_get_buffer(pr, meta_off, 0x200);
+       if (!via)
+               return -1;
+       if (le16_to_cpu(via->signature) != VIA_SIGNATURE)
+               return -1;
+       if (via->version_number > 1)
+               return -1;
+       if (!meta_checksum(via))
+               return -1;
+       if (blkid_probe_sprintf_version(pr, "%u", via->version_number) != 0)
+               return -1;
+       return 0;
+}
+
+const struct blkid_idinfo viaraid_idinfo = {
+       .name           = "via_raid_member",
+       .usage          = BLKID_USAGE_RAID,
+       .probefunc      = probe_viaraid
+};
+
+