diff options
Diffstat (limited to 'extras')
-rw-r--r-- | extras/volume_id/volume_id.c | 42 | ||||
-rw-r--r-- | extras/volume_id/volume_id.h | 7 |
2 files changed, 43 insertions, 6 deletions
diff --git a/extras/volume_id/volume_id.c b/extras/volume_id/volume_id.c index 0b43bc8efb..42d658895f 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 */ @@ -2050,14 +2083,14 @@ int volume_id_probe(struct volume_id *id, 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); if (rc == 0) break; @@ -2095,6 +2128,9 @@ int volume_id_probe(struct volume_id *id, rc = probe_ufs(id, off); if (rc == 0) break; + rc = probe_ntfs(id, off); + if (rc == 0) + break; rc = -1; } diff --git a/extras/volume_id/volume_id.h b/extras/volume_id/volume_id.h index c6f52bec41..d135f44e50 100644 --- a/extras/volume_id/volume_id.h +++ b/extras/volume_id/volume_id.h @@ -21,7 +21,7 @@ #ifndef _VOLUME_ID_H_ #define _VOLUME_ID_H_ -#define VOLUME_ID_VERSION 25 +#define VOLUME_ID_VERSION 26 #define VOLUME_ID_LABEL_SIZE 64 #define VOLUME_ID_UUID_SIZE 16 @@ -36,7 +36,7 @@ enum volume_id_usage { VOLUME_ID_OTHER, VOLUME_ID_FILESYSTEM, VOLUME_ID_PARTITIONTABLE, - VOLUME_ID_RAID + VOLUME_ID_RAID, }; enum volume_id_type { @@ -59,7 +59,8 @@ enum volume_id_type { VOLUME_ID_UFS, VOLUME_ID_LINUX_RAID, VOLUME_ID_LVM1, - VOLUME_ID_LVM2 + VOLUME_ID_LVM2, + VOLUME_ID_HPTRAID, }; struct volume_id_partition { |