X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=extras%2Fvolume_id%2Fvolume_id%2Fhighpoint.c;h=938a8934e57d6559f21a7735552fe6bafd671604;hb=afa3c553b1ff0ceb3e038cdf86d9261a8b8aa5d6;hp=e13fd6de618d5df0a35dd93590155d242bfa561f;hpb=e4d4a557e53c3fbcf14bd1bb29686fd884905b53;p=elogind.git diff --git a/extras/volume_id/volume_id/highpoint.c b/extras/volume_id/volume_id/highpoint.c index e13fd6de6..938a8934e 100644 --- a/extras/volume_id/volume_id/highpoint.c +++ b/extras/volume_id/volume_id/highpoint.c @@ -39,34 +39,71 @@ #include "util.h" #include "highpoint.h" -struct hpt37x { +struct hpt37x_meta { __u8 filler1[32]; __u32 magic; - __u32 magic_0; - __u32 magic_1; -} __attribute__((packed)) *hpt; +} __attribute__((packed)); + +struct hpt45x_meta { + __u32 magic; +} __attribute__((packed)); #define HPT37X_CONFIG_OFF 0x1200 #define HPT37X_MAGIC_OK 0x5a7816f0 #define HPT37X_MAGIC_BAD 0x5a7816fd -int volume_id_probe_highpoint_ataraid(struct volume_id *id, __u64 off) +#define HPT45X_MAGIC_OK 0x5a7816f3 +#define HPT45X_MAGIC_BAD 0x5a7816fd + + +int volume_id_probe_highpoint_37x_raid(struct volume_id *id, __u64 off) { const __u8 *buf; + struct hpt37x_meta *hpt; + __u32 magic; - dbg("probing at offset %llu", off); + dbg("probing at offset 0x%llx", (unsigned long long) off); buf = volume_id_get_buffer(id, off + HPT37X_CONFIG_OFF, 0x200); if (buf == NULL) return -1; - hpt = (struct hpt37x *) buf; + hpt = (struct hpt37x_meta *) buf; + magic = le32_to_cpu(hpt->magic); + if (magic != HPT37X_MAGIC_OK && magic != HPT37X_MAGIC_BAD) + return -1; + + volume_id_set_usage(id, VOLUME_ID_RAID); + id->type = "highpoint_raid_member"; + + return 0; +} + +int volume_id_probe_highpoint_45x_raid(struct volume_id *id, __u64 off, __u64 size) +{ + const __u8 *buf; + struct hpt45x_meta *hpt; + __u64 meta_off; + __u32 magic; + + dbg("probing at offset 0x%llx, size 0x%llx", + (unsigned long long) off, (unsigned long long) size); + + if (size < 0x10000) + return -1; + + meta_off = ((size / 0x200)-11) * 0x200; + buf = volume_id_get_buffer(id, off + meta_off, 0x200); + if (buf == NULL) + return -1; - if (hpt->magic != HPT37X_MAGIC_OK && hpt->magic != HPT37X_MAGIC_BAD) + hpt = (struct hpt45x_meta *) buf; + magic = le32_to_cpu(hpt->magic); + if (magic != HPT45X_MAGIC_OK && magic != HPT45X_MAGIC_BAD) return -1; volume_id_set_usage(id, VOLUME_ID_RAID); - id->type = "hpt_ataraid_member"; + id->type = "highpoint_raid_member"; return 0; }