summaryrefslogtreecommitdiff
path: root/extras/volume_id/volume_id.c
diff options
context:
space:
mode:
Diffstat (limited to 'extras/volume_id/volume_id.c')
-rw-r--r--extras/volume_id/volume_id.c42
1 files changed, 39 insertions, 3 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;
}