summaryrefslogtreecommitdiff
blob: 803c59d9b54c812ea2851ea35d134e434c80a7fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
--- hal-0.5.7.1/volume_id/via_raid.c	2006-02-21 20:15:17.000000000 +0100
+++ hal-0.5.7.1/volume_id/via_raid.c-new	2006-12-16 17:48:31.000000000 +0100
@@ -3,6 +3,9 @@
  *
  * Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org>
  *
+ * Based on information taken from dmraid:
+ * Copyright (C) 2004-2006 Heinz Mauelshagen, Red Hat GmbH
+ *
  *	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.
@@ -31,7 +34,7 @@
 	uint16_t	signature;
 	uint8_t		version_number;
 	struct via_array {
-		uint16_t	disk_bits;
+		uint16_t	disk_bit_mask;
 		uint8_t		disk_array_ex;
 		uint32_t	capacity_low;
 		uint32_t	capacity_high;
@@ -43,6 +46,17 @@
 
 #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;
+}
+
 int volume_id_probe_via_raid(struct volume_id *id, uint64_t off, uint64_t size)
 {
 	const uint8_t *buf;
@@ -68,6 +82,9 @@
 	if (via->version_number > 1)
 		return -1;
 
+	if (!meta_checksum(via))
+		return -1;
+
 	volume_id_set_usage(id, VOLUME_ID_RAID);
 	snprintf(id->type_version, sizeof(id->type_version)-1, "%u", via->version_number);
 	id->type = "via_raid_member";