Package: dmraid / 1.0.0.rc16-12

23_pdc_dump_extended_metadata.patch Patch series | download
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
From: Phillip Susi <psusi@cfl.rr.com>
Last-Update: 2011-03-08
Forwarded: Yes
Description: PDC supports up to 4 sets of metadata to describe
 different arrays. Only the first set was being dumped with
 dmraid -rD or -n.  This patch corrects that.  Also fixes the
 .offset file, which was always reporting 0.

Index: b/1.0.0.rc16/lib/format/ataraid/pdc.c
===================================================================
--- a/1.0.0.rc16/lib/format/ataraid/pdc.c
+++ b/1.0.0.rc16/lib/format/ataraid/pdc.c
@@ -172,7 +172,6 @@
 	unsigned *s = end_sectors;
 	uint64_t sector;
 
-	*size = sizeof(*ret);
 	pdc_sectors_max = di->sectors - div_up(*size, 512);
 
 	if (!(ret = alloc_private(lc, handler,
@@ -219,7 +218,9 @@
 		dbg_free(ret);
 		ret = NULL;
 	}
-
+	*size = sizeof(*ret) * ma;
+	*offset = di->sectors - info->u32;
+	*offset <<= 9;
 	return ret;
 }
 
@@ -544,60 +545,64 @@
 static void
 _pdc_log(struct lib_context *lc, struct dev_info *di, struct pdc *pdc)
 {
-	unsigned i;
+	unsigned i, ma = count_meta_areas(pdc);
 	struct pdc_disk *disk;
 
-	log_print(lc, "%s (%s):", di->path, handler);
-	DP("promise_id: \"%s\"", pdc, pdc->promise_id);
-	P("unknown_0: 0x%x %u",
-	  pdc, pdc->unknown_0, pdc->unknown_0, pdc->unknown_0);
-	DP("magic_0: 0x%x", pdc, pdc->magic_0);
-	P("unknown_1: 0x%x %u",
-	  pdc, pdc->unknown_1, pdc->unknown_1, pdc->unknown_1);
-	DP("magic_1: 0x%x", pdc, pdc->magic_1);
-	P("unknown_2: 0x%x %u",
-	  pdc, pdc->unknown_2, pdc->unknown_2, pdc->unknown_2);
-	DP("raid.flags: 0x%x", pdc, pdc->raid.flags);
-	P("raid.unknown_0: 0x%x %d",
-	  pdc, pdc->raid.unknown_0, pdc->raid.unknown_0, pdc->raid.unknown_0);
-	DP("raid.disk_number: %u", pdc, pdc->raid.disk_number);
-	DP("raid.channel: %u", pdc, pdc->raid.channel);
-	DP("raid.device: %u", pdc, pdc->raid.device);
-	DP("raid.magic_0: 0x%x", pdc, pdc->raid.magic_0);
-	P("raid.unknown_1: 0x%x %u",
-	  pdc, pdc->raid.unknown_1, pdc->raid.unknown_1, pdc->raid.unknown_1);
-	P("raid.start: 0x%x %u",
-	  pdc, pdc->raid.start, pdc->raid.start, pdc->raid.start);
-	DP("raid.disk_secs: %u", pdc, pdc->raid.disk_secs);
-	P("raid.unknown_3: 0x%x %u",
-	  pdc, pdc->raid.unknown_3, pdc->raid.unknown_3, pdc->raid.unknown_3);
-	P("raid.unknown_4: 0x%x %u",
-	  pdc, pdc->raid.unknown_4, pdc->raid.unknown_4, pdc->raid.unknown_4);
-	DP("raid.status: 0x%x", pdc, pdc->raid.status);
-	DP("raid.type: 0x%x", pdc, pdc->raid.type);
-	DP("raid.total_disks: %u", pdc, pdc->raid.total_disks);
-	DP("raid.raid0_shift: %u", pdc, pdc->raid.raid0_shift);
-	DP("raid.raid0_disks: %u", pdc, pdc->raid.raid0_disks);
-	DP("raid.array_number: %u", pdc, pdc->raid.array_number);
-	DP("raid.total_secs: %u", pdc, pdc->raid.total_secs);
-	DP("raid.cylinders: %u", pdc, pdc->raid.cylinders);
-	DP("raid.heads: %u", pdc, pdc->raid.heads);
-	DP("raid.sectors: %u", pdc, pdc->raid.sectors);
-	DP("raid.magic_1: 0x%x", pdc, pdc->raid.magic_1);
-	P("raid.unknown_5: 0x%x %u",
-	  pdc, pdc->raid.unknown_5, pdc->raid.unknown_5, pdc->raid.unknown_5);
-
-	for (disk = pdc->raid.disk, i = 0;
-	     i < pdc->raid.total_disks; disk++, i++) {
-		P2("raid.disk[%d].unknown_0: 0x%x", pdc, i, disk->unknown_0);
-		P2("raid.disk[%d].channel: %u", pdc, i, disk->channel);
-		P2("raid.disk[%d].device: %u", pdc, i, disk->device);
-		P2("raid.disk[%d].magic_0: 0x%x", pdc, i, disk->magic_0);
-		P2("raid.disk[%d].disk_number: %u", pdc, i, disk->disk_number);
-	}
+	while (ma) {
+		log_print(lc, "%s (%s):", di->path, handler);
+		DP("promise_id: \"%s\"", pdc, pdc->promise_id);
+		P("unknown_0: 0x%x %u",
+		  pdc, pdc->unknown_0, pdc->unknown_0, pdc->unknown_0);
+		DP("magic_0: 0x%x", pdc, pdc->magic_0);
+		P("unknown_1: 0x%x %u",
+		  pdc, pdc->unknown_1, pdc->unknown_1, pdc->unknown_1);
+		DP("magic_1: 0x%x", pdc, pdc->magic_1);
+		P("unknown_2: 0x%x %u",
+		  pdc, pdc->unknown_2, pdc->unknown_2, pdc->unknown_2);
+		DP("raid.flags: 0x%x", pdc, pdc->raid.flags);
+		P("raid.unknown_0: 0x%x %d",
+		  pdc, pdc->raid.unknown_0, pdc->raid.unknown_0, pdc->raid.unknown_0);
+		DP("raid.disk_number: %u", pdc, pdc->raid.disk_number);
+		DP("raid.channel: %u", pdc, pdc->raid.channel);
+		DP("raid.device: %u", pdc, pdc->raid.device);
+		DP("raid.magic_0: 0x%x", pdc, pdc->raid.magic_0);
+		P("raid.unknown_1: 0x%x %u",
+		  pdc, pdc->raid.unknown_1, pdc->raid.unknown_1, pdc->raid.unknown_1);
+		P("raid.start: 0x%x %u",
+		  pdc, pdc->raid.start, pdc->raid.start, pdc->raid.start);
+		DP("raid.disk_secs: %u", pdc, pdc->raid.disk_secs);
+		P("raid.unknown_3: 0x%x %u",
+		  pdc, pdc->raid.unknown_3, pdc->raid.unknown_3, pdc->raid.unknown_3);
+		P("raid.unknown_4: 0x%x %u",
+		  pdc, pdc->raid.unknown_4, pdc->raid.unknown_4, pdc->raid.unknown_4);
+		DP("raid.status: 0x%x", pdc, pdc->raid.status);
+		DP("raid.type: 0x%x", pdc, pdc->raid.type);
+		DP("raid.total_disks: %u", pdc, pdc->raid.total_disks);
+		DP("raid.raid0_shift: %u", pdc, pdc->raid.raid0_shift);
+		DP("raid.raid0_disks: %u", pdc, pdc->raid.raid0_disks);
+		DP("raid.array_number: %u", pdc, pdc->raid.array_number);
+		DP("raid.total_secs: %u", pdc, pdc->raid.total_secs);
+		DP("raid.cylinders: %u", pdc, pdc->raid.cylinders);
+		DP("raid.heads: %u", pdc, pdc->raid.heads);
+		DP("raid.sectors: %u", pdc, pdc->raid.sectors);
+		DP("raid.magic_1: 0x%x", pdc, pdc->raid.magic_1);
+		P("raid.unknown_5: 0x%x %u",
+		  pdc, pdc->raid.unknown_5, pdc->raid.unknown_5, pdc->raid.unknown_5);
+
+		for (disk = pdc->raid.disk, i = 0;
+		     i < pdc->raid.total_disks; disk++, i++) {
+			P2("raid.disk[%d].unknown_0: 0x%x", pdc, i, disk->unknown_0);
+			P2("raid.disk[%d].channel: %u", pdc, i, disk->channel);
+			P2("raid.disk[%d].device: %u", pdc, i, disk->device);
+			P2("raid.disk[%d].magic_0: 0x%x", pdc, i, disk->magic_0);
+			P2("raid.disk[%d].disk_number: %u", pdc, i, disk->disk_number);
+		}
 
-	P("checksum: 0x%x %s", pdc, pdc->checksum, pdc->checksum,
-	  checksum(pdc) ? "Ok" : "BAD");
+		P("checksum: 0x%x %s", pdc, pdc->checksum, pdc->checksum,
+		  checksum(pdc) ? "Ok" : "BAD");
+		ma--;
+		pdc++;
+	}
 }
 
 static void