summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extras/volume_id/volume_id.c42
-rw-r--r--extras/volume_id/volume_id.h7
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 {