/* * Copyright (C) 2009 Mike Hommey * * This file may be redistributed under the terms of the * GNU Lesser General Public License. */ #include "superblocks.h" struct vmfs_fs_info { uint32_t magic; uint32_t volume_version; uint8_t version; uint8_t uuid[16]; uint32_t mode; char label[128]; } __attribute__ ((__packed__)); struct vmfs_volume_info { uint32_t magic; uint32_t ver; uint8_t irrelevant[122]; uint8_t uuid[16]; } __attribute__ ((__packed__)); static int probe_vmfs_fs(blkid_probe pr, const struct blkid_idmag *mag) { struct vmfs_fs_info *header; header = blkid_probe_get_sb(pr, mag, struct vmfs_fs_info); if (header == NULL) return errno ? -errno : 1; blkid_probe_sprintf_uuid(pr, (unsigned char *) header->uuid, 16, "%02x%02x%02x%02x-%02x%02x%02x%02x-" "%02x%02x-%02x%02x%02x%02x%02x%02x", header->uuid[3], header->uuid[2], header->uuid[1], header->uuid[0], header->uuid[7], header->uuid[6], header->uuid[5], header->uuid[4], header->uuid[9], header->uuid[8], header->uuid[10], header->uuid[11], header->uuid[12], header->uuid[13], header->uuid[14], header->uuid[15]); blkid_probe_set_label(pr, (unsigned char *) header->label, sizeof(header->label)); blkid_probe_sprintf_version(pr, "%u", header->version); return 0; } static int probe_vmfs_volume(blkid_probe pr, const struct blkid_idmag *mag) { struct vmfs_volume_info *header; unsigned char *lvm_uuid; header = blkid_probe_get_sb(pr, mag, struct vmfs_volume_info); if (header == NULL) return errno ? -errno : 1; blkid_probe_sprintf_value(pr, "UUID_SUB", "%02x%02x%02x%02x-%02x%02x%02x%02x-" "%02x%02x-%02x%02x%02x%02x%02x%02x", header->uuid[3], header->uuid[2], header->uuid[1], header->uuid[0], header->uuid[7], header->uuid[6], header->uuid[5], header->uuid[4], header->uuid[9], header->uuid[8], header->uuid[10], header->uuid[11], header->uuid[12], header->uuid[13], header->uuid[14], header->uuid[15]); blkid_probe_sprintf_version(pr, "%u", le32_to_cpu(header->ver)); lvm_uuid = blkid_probe_get_buffer(pr, 1024 * 1024 /* Start of the volume info */ + 512 /* Offset to lvm info */ + 20 /* Offset in lvm info */, 35); if (lvm_uuid) blkid_probe_strncpy_uuid(pr, lvm_uuid, 35); return 0; } const struct blkid_idinfo vmfs_fs_idinfo = { .name = "VMFS", .usage = BLKID_USAGE_FILESYSTEM, .probefunc = probe_vmfs_fs, .magics = { { .magic = "\x5e\xf1\xab\x2f", .len = 4, .kboff = 2048 }, { NULL } } }; const struct blkid_idinfo vmfs_volume_idinfo = { .name = "VMFS_volume_member", .usage = BLKID_USAGE_RAID, .probefunc = probe_vmfs_volume, .magics = { { .magic = "\x0d\xd0\x01\xc0", .len = 4, .kboff = 1024 }, { NULL } } };