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 xfs_super_block { 30 uint8_t magic[4]; 31 uint32_t blocksize; 32 uint64_t dblocks; 33 uint64_t rblocks; 34 uint32_t dummy1[2]; 35 uint8_t uuid[16]; 36 uint32_t dummy2[15]; 37 uint8_t fname[12]; 38 uint32_t dummy3[2]; 39 uint64_t icount; 40 uint64_t ifree; 41 uint64_t fdblocks; 42} PACKED; 43 44int volume_id_probe_xfs(struct volume_id *id, uint64_t off, uint64_t size) 45{ 46 struct xfs_super_block *xs; 47 48 info("probing at offset 0x%llx", (unsigned long long) off); 49 50 xs = (struct xfs_super_block *) volume_id_get_buffer(id, off, 0x200); 51 if (xs == NULL) 52 return -1; 53 54 if (memcmp(xs->magic, "XFSB", 4) != 0) 55 return -1; 56 57 volume_id_set_label_raw(id, xs->fname, 12); 58 volume_id_set_label_string(id, xs->fname, 12); 59 volume_id_set_uuid(id, xs->uuid, 0, UUID_DCE); 60 61 volume_id_set_usage(id, VOLUME_ID_FILESYSTEM); 62 id->type = "xfs"; 63 64 return 0; 65} 66