1/* 2 * volume_id - reads filesystem label and uuid 3 * 4 * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org> 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the 8 * Free Software Foundation version 2 of the License. 9 */ 10 11#ifndef _GNU_SOURCE 12#define _GNU_SOURCE 1 13#endif 14 15#ifdef HAVE_CONFIG_H 16# include <config.h> 17#endif 18 19#include <stdio.h> 20#include <stdlib.h> 21#include <unistd.h> 22#include <string.h> 23#include <errno.h> 24#include <ctype.h> 25 26#include "libvolume_id.h" 27#include "util.h" 28 29struct hpt37x_meta { 30 uint8_t filler1[32]; 31 uint32_t magic; 32} PACKED; 33 34struct hpt45x_meta { 35 uint32_t magic; 36} PACKED; 37 38#define HPT37X_CONFIG_OFF 0x1200 39#define HPT37X_MAGIC_OK 0x5a7816f0 40#define HPT37X_MAGIC_BAD 0x5a7816fd 41 42#define HPT45X_MAGIC_OK 0x5a7816f3 43#define HPT45X_MAGIC_BAD 0x5a7816fd 44 45 46int volume_id_probe_highpoint_37x_raid(struct volume_id *id, uint64_t off, uint64_t size) 47{ 48 const uint8_t *buf; 49 struct hpt37x_meta *hpt; 50 uint32_t magic; 51 52 info("probing at offset 0x%llx", (unsigned long long) off); 53 54 buf = volume_id_get_buffer(id, off + HPT37X_CONFIG_OFF, 0x200); 55 if (buf == NULL) 56 return -1; 57 58 hpt = (struct hpt37x_meta *) buf; 59 magic = le32_to_cpu(hpt->magic); 60 if (magic != HPT37X_MAGIC_OK && magic != HPT37X_MAGIC_BAD) 61 return -1; 62 63 volume_id_set_usage(id, VOLUME_ID_RAID); 64 id->type = "highpoint_raid_member"; 65 66 return 0; 67} 68 69int volume_id_probe_highpoint_45x_raid(struct volume_id *id, uint64_t off, uint64_t size) 70{ 71 const uint8_t *buf; 72 struct hpt45x_meta *hpt; 73 uint64_t meta_off; 74 uint32_t magic; 75 76 dbg("probing at offset 0x%llx, size 0x%llx", 77 (unsigned long long) off, (unsigned long long) size); 78 79 if (size < 0x10000) 80 return -1; 81 82 meta_off = ((size / 0x200)-11) * 0x200; 83 buf = volume_id_get_buffer(id, off + meta_off, 0x200); 84 if (buf == NULL) 85 return -1; 86 87 hpt = (struct hpt45x_meta *) buf; 88 magic = le32_to_cpu(hpt->magic); 89 if (magic != HPT45X_MAGIC_OK && magic != HPT45X_MAGIC_BAD) 90 return -1; 91 92 volume_id_set_usage(id, VOLUME_ID_RAID); 93 id->type = "highpoint_raid_member"; 94 95 return 0; 96} 97