1/* 2 * volume_id - reads filesystem label and uuid 3 * 4 * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org> 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 */ 20 21#include "volume_id_internal.h" 22 23struct lvm1_super_block { 24 uint8_t id[2]; 25} PACKED; 26 27struct lvm2_super_block { 28 uint8_t id[8]; 29 uint64_t sector_xl; 30 uint32_t crc_xl; 31 uint32_t offset_xl; 32 uint8_t type[8]; 33} PACKED; 34 35#define LVM1_SB_OFF 0x400 36 37int FAST_FUNC volume_id_probe_lvm1(struct volume_id *id, uint64_t off) 38{ 39 struct lvm1_super_block *lvm; 40 41 dbg("probing at offset 0x%llx", (unsigned long long) off); 42 43 lvm = volume_id_get_buffer(id, off + LVM1_SB_OFF, 0x800); 44 if (lvm == NULL) 45 return -1; 46 47 if (lvm->id[0] != 'H' || lvm->id[1] != 'M') 48 return -1; 49 50// volume_id_set_usage(id, VOLUME_ID_RAID); 51// id->type = "LVM1_member"; 52 53 return 0; 54} 55 56#define LVM2_LABEL_ID "LABELONE" 57#define LVM2LABEL_SCAN_SECTORS 4 58 59int FAST_FUNC volume_id_probe_lvm2(struct volume_id *id, uint64_t off) 60{ 61 const uint8_t *buf; 62 unsigned soff; 63 struct lvm2_super_block *lvm; 64 65 dbg("probing at offset 0x%llx", (unsigned long long) off); 66 67 buf = volume_id_get_buffer(id, off, LVM2LABEL_SCAN_SECTORS * 0x200); 68 if (buf == NULL) 69 return -1; 70 71 72 for (soff = 0; soff < LVM2LABEL_SCAN_SECTORS * 0x200; soff += 0x200) { 73 lvm = (struct lvm2_super_block *) &buf[soff]; 74 75 if (memcmp(lvm->id, LVM2_LABEL_ID, 8) == 0) 76 goto found; 77 } 78 79 return -1; 80 81 found: 82// memcpy(id->type_version, lvm->type, 8); 83// volume_id_set_usage(id, VOLUME_ID_RAID); 84// id->type = "LVM2_member"; 85 86 return 0; 87} 88