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