// Copyright (C) 2012 Red Hat, Inc. All rights reserved. // // This file is part of the thin-provisioning-tools source. // // thin-provisioning-tools is free software: you can redistribute it // and/or modify it under the terms of the GNU General Public License // as published by the Free Software Foundation, either version 3 of // the License, or (at your option) any later version. // // thin-provisioning-tools is distributed in the hope that it will be // useful, but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with thin-provisioning-tools. If not, see // . #ifndef CACHE_METADATA_DISK_STRUCTURES_H #define CACHE_METADATA_DISK_STRUCTURES_H #include "endian_utils.h" #include "btree.h" //---------------------------------------------------------------- // FIXME: rename to just METADATA_DISK_STRUCTURES namespace cache_tools { using namespace base; // FIXME: don't use namespaces in headers. unsigned const SPACE_MAP_ROOT_SIZE = 128; typedef unsigned char __u8; struct superblock_disk { __le32 csum; __le32 flags; __le64 blocknr; __u8 uuid[16]; __le64 magic; __le32 version; __u8 policy_name[CACHE_POLICY_NAME_SIZE]; __le32 policy_version[CACHE_POLICY_VERSION_SIZE]; __le32 policy_hint_size; __u8 metadata_space_map_root[SPACE_MAP_ROOT_SIZE]; __le64 mapping_root; __le64 hint_root; __le64 discard_root; __le64 discard_block_size; __le64 discard_nr_blocks; __le32 data_block_size; /* in 512-byte sectors */ __le32 metadata_block_size; /* in 512-byte sectors */ __le32 cache_blocks; __le32 compat_flags_; __le32 compat_ro_flags_; __le32 incompat_flags_; __le32 read_hits; __le32 read_misses; __le32 write_hits; __le32 write_misses; } __attribute__ ((packed)); struct superblock { uint32_t csum; uint32_t flags; uint64_t blocknr; __u8 uuid[16]; uint64_t magic; uint32_t version; __u8 policy_name[CACHE_POLICY_NAME_SIZE]; uint32_t policy_version[CACHE_POLICY_VERSION_SIZE]; uint32_t policy_hint_size; __u8 metadata_space_map_root[SPACE_MAP_ROOT_SIZE]; uint64_t mapping_root; uint64_t hint_root; uint64_t discard_root; uint64_t discard_block_size; uint64_t discard_nr_blocks; uint32_t data_block_size; /* in 512-byte sectors */ uint32_t metadata_block_size; /* in 512-byte sectors */ uint32_t cache_blocks; uint32_t compat_flags_; uint32_t compat_ro_flags_; uint32_t incompat_flags_; uint32_t read_hits; uint32_t read_misses; uint32_t write_hits; uint32_t write_misses; }; struct superblock_traits { typedef superblock_disk disk_type; typedef superblock value_type; static void unpack(superblock_disk const &disk, superblock &value); static void pack(superblock const &value, superblock_disk &disk); }; } //---------------------------------------------------------------- #endif