From 46be4f093b7a02a3678d6cb802f8532b92b61ccc Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 9 Sep 2008 11:38:39 +0200 Subject: [PATCH] blkid: add VIA RAID Signed-off-by: Karel Zak --- libs/blkid/src/probe.c | 3 +- libs/blkid/src/probers/Makefile.am | 3 +- libs/blkid/src/probers/probers.h | 1 + libs/blkid/src/probers/via_raid.c | 83 ++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 libs/blkid/src/probers/via_raid.c diff --git a/libs/blkid/src/probe.c b/libs/blkid/src/probe.c index ac389873..4fc3b83e 100644 --- a/libs/blkid/src/probe.c +++ b/libs/blkid/src/probe.c @@ -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 diff --git a/libs/blkid/src/probers/Makefile.am b/libs/blkid/src/probers/Makefile.am index 0b36608e..5a5bf7e5 100644 --- a/libs/blkid/src/probers/Makefile.am +++ b/libs/blkid/src/probers/Makefile.am @@ -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) diff --git a/libs/blkid/src/probers/probers.h b/libs/blkid/src/probers/probers.h index 10e2aee5..e5313364 100644 --- a/libs/blkid/src/probers/probers.h +++ b/libs/blkid/src/probers/probers.h @@ -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 index 00000000..2a2557ca --- /dev/null +++ b/libs/blkid/src/probers/via_raid.c @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2008 Karel Zak + * 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 +#include +#include +#include +#include +#include +#include + +#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 +}; + + -- 2.39.5