From a5d00f9d3725c701d5a2d7a14dfcc7864aac27fb Mon Sep 17 00:00:00 2001 From: "kay.sievers@vrfy.org" Date: Tue, 2 Nov 2004 10:22:11 +0100 Subject: [PATCH] [PATCH] Add support for highpoint ataraid to volume_id to suppress --- extras/volume_id/volume_id.c | 42 +++++++++++++++++++++++++++++++++--- 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 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; diff --git a/extras/volume_id/volume_id.h b/extras/volume_id/volume_id.h index c6f52bec4..d135f44e5 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 { -- 2.30.2