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
|