/* * Copyright (C) 2012 Red Hat, Inc. * * This file is released under the GPL. */#include"dm-cache-metadata.h"#include"persistent-data/dm-array.h"#include"persistent-data/dm-bitset.h"#include"persistent-data/dm-space-map.h"#include"persistent-data/dm-space-map-disk.h"#include"persistent-data/dm-transaction-manager.h"#include<linux/device-mapper.h>/*----------------------------------------------------------------*/#define DM_MSG_PREFIX "cache metadata"#define CACHE_SUPERBLOCK_MAGIC 06142003#define CACHE_SUPERBLOCK_LOCATION 0/* * defines a range of metadata versions that this module can handle. */#define MIN_CACHE_VERSION 1#define MAX_CACHE_VERSION 1#define CACHE_METADATA_CACHE_SIZE 64/* * 3 for btree insert + * 2 for btree lookup used within space map */#define CACHE_MAX_CONCURRENT_LOCKS 5#define SPACE_MAP_ROOT_SIZE 128enumsuperblock_flag_bits{/* for spotting crashes that would invalidate the dirty bitset */CLEAN_SHUTDOWN,};/* * Each mapping from cache block -> origin block carries a set of flags. */enummapping_bits{/* * A valid mapping. Because we're using an array we clear this * flag for an non existant mapping. */M_VALID=1,/* * The data on the cache is different from that on the origin. */M_DIRTY=2};structcache_disk_superblock{__le32csum;__le32flags;__le64blocknr;__u8uuid[16];__le64magic;__le32version;__u8policy_name[CACHE_POLICY_NAME_SIZE];__le32policy_hint_size;__u8metadata_space_map_root[SPACE_MAP_ROOT_SIZE];__le64mapping_root;__le64hint_root;__le64discard_root;__le64discard_block_size;__le64discard_nr_blocks;__le32data_block_size;__le32metadata_block_size;__le32cache_blocks;__le32compat_flags;__le32compat_ro_flags;__le32incompat_flags;__le32read_hits;__le32read_misses;__le32write_hits;__le32write_misses;__le32policy_version[CACHE_POLICY_VERSION_SIZE];}__packed;structdm_cache_metadata{atomic_tref_count;structlist_headlist;structblock_device*bdev;structdm_block_manager*bm;structdm_space_map*metadata_sm;structdm_transaction_manager*