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