X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=extras%2Fvolume_id%2Fvolume_id.c;h=42d658895f11ffe8f68d37eb170ee85c78527fbf;hb=a5d00f9d3725c701d5a2d7a14dfcc7864aac27fb;hp=0b43bc8efb84ffd6afd263abce483b840c538ded;hpb=56b979e00d87d1766b61716f07870701aca20ead;p=elogind.git diff --git a/extras/volume_id/volume_id.c b/extras/volume_id/volume_id.c index 0b43bc8ef..42d658895 100644 --- a/extras/volume_id/volume_id.c +++ b/extras/volume_id/volume_id.c @@ -263,6 +263,36 @@ static void free_buffer(struct volume_id *id) } } +#define HPT37X_CONFIG_OFF 0x1200 +#define HPT37X_MAGIC_OK 0x5a7816f0 +#define HPT37X_MAGIC_BAD 0x5a7816fd +static int probe_highpoint_ataraid(struct volume_id *id, __u64 off) +{ + struct hpt37x { + __u8 filler1[32]; + __u32 magic; + __u32 magic_0; + __u32 magic_1; + } __attribute__((packed)) *hpt; + + const __u8 *buf; + + buf = get_buffer(id, off + HPT37X_CONFIG_OFF, 0x200); + if (buf == NULL) + return -1; + + hpt = (struct hpt37x *) buf; + + if (hpt->magic != HPT37X_MAGIC_OK && hpt->magic != HPT37X_MAGIC_BAD) + return -1; + + id->usage_id = VOLUME_ID_RAID; + id->type_id = VOLUME_ID_HPTRAID; + id->type = "hpt_ataraid_member"; + + return 0; +} + #define LVM1_SB_OFF 0x400 #define LVM1_MAGIC "HM" static int probe_lvm1(struct volume_id *id, __u64 off) @@ -2038,6 +2068,9 @@ int volume_id_probe(struct volume_id *id, case VOLUME_ID_LVM2: rc = probe_lvm2(id, off); break; + case VOLUME_ID_HPTRAID: + rc = probe_highpoint_ataraid(id, off); + break; case VOLUME_ID_ALL: default: /* probe for raid first, cause fs probes may be successful on raid members */ @@ -2048,14 +2081,14 @@ int volume_id_probe(struct volume_id *id, if (rc == 0) break; rc = probe_lvm2(id, off); + if (rc == 0) + break; + rc = probe_highpoint_ataraid(id, off); if (rc == 0) break; /* signature in the first block, only small buffer needed */ rc = probe_msdos_part_table(id, off); - if (rc == 0) - break; - rc = probe_ntfs(id, off); if (rc == 0) break; rc = probe_vfat(id, off); @@ -2093,6 +2126,9 @@ int volume_id_probe(struct volume_id *id, if (rc == 0) break; rc = probe_ufs(id, off); + if (rc == 0) + break; + rc = probe_ntfs(id, off); if (rc == 0) break;