1e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#ifndef _LINUX_BCACHE_H 2e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define _LINUX_BCACHE_H 3e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 4e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* 5e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * Bcache on disk data structures 6e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris */ 7e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 8e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#include <asm/types.h> 9e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 10e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BITMASK(name, type, field, offset, size) \ 11e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline __u64 name(const type *k) \ 12e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ return (k->field >> offset) & ~(~0ULL << size); } \ 13e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris \ 14e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline void SET_##name(type *k, __u64 v) \ 15e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ \ 16e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris k->field &= ~(~(~0ULL << size) << offset); \ 17e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris k->field |= (v & ~(~0ULL << size)) << offset; \ 18e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 19e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 20e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* Btree keys - all units are in sectors */ 21e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 22e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstruct bkey { 23e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 high; 24e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 low; 25e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 ptr[]; 26e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris}; 27e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 28e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define KEY_FIELD(name, field, offset, size) \ 29e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris BITMASK(name, struct bkey, field, offset, size) 30e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 31e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define PTR_FIELD(name, offset, size) \ 32e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline __u64 name(const struct bkey *k, unsigned i) \ 33e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ return (k->ptr[i] >> offset) & ~(~0ULL << size); } \ 34e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris \ 35e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline void SET_##name(struct bkey *k, unsigned i, __u64 v) \ 36e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ \ 37e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris k->ptr[i] &= ~(~(~0ULL << size) << offset); \ 38e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris k->ptr[i] |= (v & ~(~0ULL << size)) << offset; \ 39e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 40e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 41e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define KEY_SIZE_BITS 16 42e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define KEY_MAX_U64S 8 43e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 44e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisKEY_FIELD(KEY_PTRS, high, 60, 3) 45e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisKEY_FIELD(HEADER_SIZE, high, 58, 2) 46e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisKEY_FIELD(KEY_CSUM, high, 56, 2) 47e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisKEY_FIELD(KEY_PINNED, high, 55, 1) 48e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisKEY_FIELD(KEY_DIRTY, high, 36, 1) 49e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 50e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisKEY_FIELD(KEY_SIZE, high, 20, KEY_SIZE_BITS) 51e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisKEY_FIELD(KEY_INODE, high, 0, 20) 52e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 53e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* Next time I change the on disk format, KEY_OFFSET() won't be 64 bits */ 54e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 55e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline __u64 KEY_OFFSET(const struct bkey *k) 56e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ 57e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris return k->low; 58e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 59e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 60e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline void SET_KEY_OFFSET(struct bkey *k, __u64 v) 61e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ 62e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris k->low = v; 63e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 64e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 65e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* 66e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * The high bit being set is a relic from when we used it to do binary 67e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * searches - it told you where a key started. It's not used anymore, 68e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * and can probably be safely dropped. 69e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris */ 70e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define KEY(inode, offset, size) \ 71e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris((struct bkey) { \ 72e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris .high = (1ULL << 63) | ((__u64) (size) << 20) | (inode), \ 73e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris .low = (offset) \ 74e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris}) 75e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 76e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define ZERO_KEY KEY(0, 0, 0) 77e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 78e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define MAX_KEY_INODE (~(~0 << 20)) 79e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define MAX_KEY_OFFSET (~0ULL >> 1) 80e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define MAX_KEY KEY(MAX_KEY_INODE, MAX_KEY_OFFSET, 0) 81e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 82e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define KEY_START(k) (KEY_OFFSET(k) - KEY_SIZE(k)) 83e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define START_KEY(k) KEY(KEY_INODE(k), KEY_START(k), 0) 84e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 85e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define PTR_DEV_BITS 12 86e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 87e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisPTR_FIELD(PTR_DEV, 51, PTR_DEV_BITS) 88e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisPTR_FIELD(PTR_OFFSET, 8, 43) 89e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisPTR_FIELD(PTR_GEN, 0, 8) 90e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 91e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define PTR_CHECK_DEV ((1 << PTR_DEV_BITS) - 1) 92e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 93e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define PTR(gen, offset, dev) \ 94e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris ((((__u64) dev) << 51) | ((__u64) offset) << 8 | gen) 95e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 96e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* Bkey utility code */ 97e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 98e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline unsigned long bkey_u64s(const struct bkey *k) 99e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ 100e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris return (sizeof(struct bkey) / sizeof(__u64)) + KEY_PTRS(k); 101e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 102e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 103e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline unsigned long bkey_bytes(const struct bkey *k) 104e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ 105e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris return bkey_u64s(k) * sizeof(__u64); 106e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 107e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 108e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define bkey_copy(_dest, _src) memcpy(_dest, _src, bkey_bytes(_src)) 109e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 110e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline void bkey_copy_key(struct bkey *dest, const struct bkey *src) 111e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ 112e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris SET_KEY_INODE(dest, KEY_INODE(src)); 113e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris SET_KEY_OFFSET(dest, KEY_OFFSET(src)); 114e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 115e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 116e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline struct bkey *bkey_next(const struct bkey *k) 117e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ 118e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 *d = (void *) k; 119e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris return (struct bkey *) (d + bkey_u64s(k)); 120e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 121e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 122e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline struct bkey *bkey_idx(const struct bkey *k, unsigned nr_keys) 123e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ 124e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 *d = (void *) k; 125e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris return (struct bkey *) (d + nr_keys); 126e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 127e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* Enough for a key with 6 pointers */ 128e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BKEY_PAD 8 129e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 130e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BKEY_PADDED(key) \ 131e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris union { struct bkey key; __u64 key ## _pad[BKEY_PAD]; } 132e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 133e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* Superblock */ 134e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 135e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* Version 0: Cache device 136e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * Version 1: Backing device 137e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * Version 2: Seed pointer into btree node checksum 138e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * Version 3: Cache device with new UUID format 139e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * Version 4: Backing device with data offset 140e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris */ 141e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BCACHE_SB_VERSION_CDEV 0 142e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BCACHE_SB_VERSION_BDEV 1 143e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BCACHE_SB_VERSION_CDEV_WITH_UUID 3 144e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BCACHE_SB_VERSION_BDEV_WITH_OFFSET 4 145e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BCACHE_SB_MAX_VERSION 4 146e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 147e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define SB_SECTOR 8 148e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define SB_SIZE 4096 149e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define SB_LABEL_SIZE 32 150e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define SB_JOURNAL_BUCKETS 256U 151e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* SB_JOURNAL_BUCKETS must be divisible by BITS_PER_LONG */ 152e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define MAX_CACHES_PER_SET 8 153e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 154e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BDEV_DATA_START_DEFAULT 16 /* sectors */ 155e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 156e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstruct cache_sb { 157e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 csum; 158e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 offset; /* sector where this sb was written */ 159e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 version; 160e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 161e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u8 magic[16]; 162e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 163e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u8 uuid[16]; 164e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris union { 165e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u8 set_uuid[16]; 166e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 set_magic; 167e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris }; 168e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u8 label[SB_LABEL_SIZE]; 169e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 170e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 flags; 171e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 seq; 172e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 pad[8]; 173e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 174e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris union { 175e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris struct { 176e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris /* Cache devices */ 177e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 nbuckets; /* device size */ 178e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 179e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u16 block_size; /* sectors */ 180e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u16 bucket_size; /* sectors */ 181e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 182e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u16 nr_in_set; 183e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u16 nr_this_dev; 184e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris }; 185e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris struct { 186e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris /* Backing devices */ 187e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 data_offset; 188e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 189e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris /* 190e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * block_size from the cache device section is still used by 191e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * backing devices, so don't add anything here until we fix 192e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * things to not need it for backing devices anymore 193e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris */ 194e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris }; 195e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris }; 196e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 197e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 last_mount; /* time_t */ 198e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 199e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u16 first_bucket; 200e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris union { 201e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u16 njournal_buckets; 202e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u16 keys; 203e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris }; 204e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 d[SB_JOURNAL_BUCKETS]; /* journal buckets */ 205e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris}; 206e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 207e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline _Bool SB_IS_BDEV(const struct cache_sb *sb) 208e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ 209e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris return sb->version == BCACHE_SB_VERSION_BDEV 210e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris || sb->version == BCACHE_SB_VERSION_BDEV_WITH_OFFSET; 211e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 212e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 213e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisBITMASK(CACHE_SYNC, struct cache_sb, flags, 0, 1); 214e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisBITMASK(CACHE_DISCARD, struct cache_sb, flags, 1, 1); 215e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisBITMASK(CACHE_REPLACEMENT, struct cache_sb, flags, 2, 3); 216e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define CACHE_REPLACEMENT_LRU 0U 217e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define CACHE_REPLACEMENT_FIFO 1U 218e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define CACHE_REPLACEMENT_RANDOM 2U 219e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 220e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisBITMASK(BDEV_CACHE_MODE, struct cache_sb, flags, 0, 4); 221e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define CACHE_MODE_WRITETHROUGH 0U 222e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define CACHE_MODE_WRITEBACK 1U 223e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define CACHE_MODE_WRITEAROUND 2U 224e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define CACHE_MODE_NONE 3U 225e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisBITMASK(BDEV_STATE, struct cache_sb, flags, 61, 2); 226e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BDEV_STATE_NONE 0U 227e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BDEV_STATE_CLEAN 1U 228e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BDEV_STATE_DIRTY 2U 229e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BDEV_STATE_STALE 3U 230e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 231e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* 232e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * Magic numbers 233e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * 234e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * The various other data structures have their own magic numbers, which are 235e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * xored with the first part of the cache set's UUID 236e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris */ 237e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 238e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define JSET_MAGIC 0x245235c1a3625032ULL 239e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define PSET_MAGIC 0x6750e15f87337f91ULL 240e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BSET_MAGIC 0x90135c78b99e07f5ULL 241e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 242e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline __u64 jset_magic(struct cache_sb *sb) 243e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ 244e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris return sb->set_magic ^ JSET_MAGIC; 245e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 246e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 247e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline __u64 pset_magic(struct cache_sb *sb) 248e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ 249e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris return sb->set_magic ^ PSET_MAGIC; 250e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 251e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 252e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline __u64 bset_magic(struct cache_sb *sb) 253e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{ 254e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris return sb->set_magic ^ BSET_MAGIC; 255e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris} 256e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 257e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* 258e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * Journal 259e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * 260e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * On disk format for a journal entry: 261e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * seq is monotonically increasing; every journal entry has its own unique 262e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * sequence number. 263e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * 264e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * last_seq is the oldest journal entry that still has keys the btree hasn't 265e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * flushed to disk yet. 266e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * 267e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * version is for on disk format changes. 268e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris */ 269e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 270e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BCACHE_JSET_VERSION_UUIDv1 1 271e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BCACHE_JSET_VERSION_UUID 1 /* Always latest UUID format */ 272e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BCACHE_JSET_VERSION 1 273e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 274e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstruct jset { 275e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 csum; 276e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 magic; 277e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 seq; 278e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 version; 279e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 keys; 280e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 281e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 last_seq; 282e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 283e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris BKEY_PADDED(uuid_bucket); 284e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris BKEY_PADDED(btree_root); 285e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u16 btree_level; 286e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u16 pad[3]; 287e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 288e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 prio_bucket[MAX_CACHES_PER_SET]; 289e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 290e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris union { 291e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris struct bkey start[0]; 292e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 d[0]; 293e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris }; 294e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris}; 295e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 296e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* Bucket prios/gens */ 297e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 298e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstruct prio_set { 299e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 csum; 300e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 magic; 301e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 seq; 302e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 version; 303e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 pad; 304e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 305e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 next_bucket; 306e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 307e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris struct bucket_disk { 308e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u16 prio; 309e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u8 gen; 310e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris } __attribute((packed)) data[]; 311e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris}; 312e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 313e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* UUIDS - per backing device/flash only volume metadata */ 314e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 315e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstruct uuid_entry { 316e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris union { 317e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris struct { 318e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u8 uuid[16]; 319e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u8 label[32]; 320e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 first_reg; 321e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 last_reg; 322e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 invalidated; 323e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 324e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 flags; 325e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris /* Size of flash only volumes */ 326e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 sectors; 327e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris }; 328e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 329e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u8 pad[128]; 330e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris }; 331e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris}; 332e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 333e084501669a4e4931c9d648351ecd7d595b81b79Christopher FerrisBITMASK(UUID_FLASH_ONLY, struct uuid_entry, flags, 0, 1); 334e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 335e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* Btree nodes */ 336e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 337e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* Version 1: Seed pointer into btree node checksum 338e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris */ 339e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BCACHE_BSET_CSUM 1 340e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define BCACHE_BSET_VERSION 1 341e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 342e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* 343e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * Btree nodes 344e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * 345e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * On disk a btree node is a list/log of these; within each set the keys are 346e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * sorted 347e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris */ 348e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstruct bset { 349e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 csum; 350e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 magic; 351e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 seq; 352e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 version; 353e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 keys; 354e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 355e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris union { 356e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris struct bkey start[0]; 357e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u64 d[0]; 358e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris }; 359e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris}; 360e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 361e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* OBSOLETE */ 362e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 363e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris/* UUIDS - per backing device/flash only volume metadata */ 364e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 365e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstruct uuid_entry_v0 { 366e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u8 uuid[16]; 367e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u8 label[32]; 368e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 first_reg; 369e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 last_reg; 370e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 invalidated; 371e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris __u32 pad; 372e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris}; 373e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris 374e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#endif /* _LINUX_BCACHE_H */ 375