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