18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 28c2ecf20Sopenharmony_ci#ifndef _LINUX_BCACHE_H 38c2ecf20Sopenharmony_ci#define _LINUX_BCACHE_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci/* 68c2ecf20Sopenharmony_ci * Bcache on disk data structures 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/types.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#define BITMASK(name, type, field, offset, size) \ 128c2ecf20Sopenharmony_cistatic inline __u64 name(const type *k) \ 138c2ecf20Sopenharmony_ci{ return (k->field >> offset) & ~(~0ULL << size); } \ 148c2ecf20Sopenharmony_ci \ 158c2ecf20Sopenharmony_cistatic inline void SET_##name(type *k, __u64 v) \ 168c2ecf20Sopenharmony_ci{ \ 178c2ecf20Sopenharmony_ci k->field &= ~(~(~0ULL << size) << offset); \ 188c2ecf20Sopenharmony_ci k->field |= (v & ~(~0ULL << size)) << offset; \ 198c2ecf20Sopenharmony_ci} 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci/* Btree keys - all units are in sectors */ 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistruct bkey { 248c2ecf20Sopenharmony_ci __u64 high; 258c2ecf20Sopenharmony_ci __u64 low; 268c2ecf20Sopenharmony_ci __u64 ptr[]; 278c2ecf20Sopenharmony_ci}; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#define KEY_FIELD(name, field, offset, size) \ 308c2ecf20Sopenharmony_ci BITMASK(name, struct bkey, field, offset, size) 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#define PTR_FIELD(name, offset, size) \ 338c2ecf20Sopenharmony_cistatic inline __u64 name(const struct bkey *k, unsigned int i) \ 348c2ecf20Sopenharmony_ci{ return (k->ptr[i] >> offset) & ~(~0ULL << size); } \ 358c2ecf20Sopenharmony_ci \ 368c2ecf20Sopenharmony_cistatic inline void SET_##name(struct bkey *k, unsigned int i, __u64 v) \ 378c2ecf20Sopenharmony_ci{ \ 388c2ecf20Sopenharmony_ci k->ptr[i] &= ~(~(~0ULL << size) << offset); \ 398c2ecf20Sopenharmony_ci k->ptr[i] |= (v & ~(~0ULL << size)) << offset; \ 408c2ecf20Sopenharmony_ci} 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#define KEY_SIZE_BITS 16 438c2ecf20Sopenharmony_ci#define KEY_MAX_U64S 8 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ciKEY_FIELD(KEY_PTRS, high, 60, 3) 468c2ecf20Sopenharmony_ciKEY_FIELD(HEADER_SIZE, high, 58, 2) 478c2ecf20Sopenharmony_ciKEY_FIELD(KEY_CSUM, high, 56, 2) 488c2ecf20Sopenharmony_ciKEY_FIELD(KEY_PINNED, high, 55, 1) 498c2ecf20Sopenharmony_ciKEY_FIELD(KEY_DIRTY, high, 36, 1) 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ciKEY_FIELD(KEY_SIZE, high, 20, KEY_SIZE_BITS) 528c2ecf20Sopenharmony_ciKEY_FIELD(KEY_INODE, high, 0, 20) 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci/* Next time I change the on disk format, KEY_OFFSET() won't be 64 bits */ 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_cistatic inline __u64 KEY_OFFSET(const struct bkey *k) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci return k->low; 598c2ecf20Sopenharmony_ci} 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_cistatic inline void SET_KEY_OFFSET(struct bkey *k, __u64 v) 628c2ecf20Sopenharmony_ci{ 638c2ecf20Sopenharmony_ci k->low = v; 648c2ecf20Sopenharmony_ci} 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci/* 678c2ecf20Sopenharmony_ci * The high bit being set is a relic from when we used it to do binary 688c2ecf20Sopenharmony_ci * searches - it told you where a key started. It's not used anymore, 698c2ecf20Sopenharmony_ci * and can probably be safely dropped. 708c2ecf20Sopenharmony_ci */ 718c2ecf20Sopenharmony_ci#define KEY(inode, offset, size) \ 728c2ecf20Sopenharmony_ci((struct bkey) { \ 738c2ecf20Sopenharmony_ci .high = (1ULL << 63) | ((__u64) (size) << 20) | (inode), \ 748c2ecf20Sopenharmony_ci .low = (offset) \ 758c2ecf20Sopenharmony_ci}) 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci#define ZERO_KEY KEY(0, 0, 0) 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci#define MAX_KEY_INODE (~(~0 << 20)) 808c2ecf20Sopenharmony_ci#define MAX_KEY_OFFSET (~0ULL >> 1) 818c2ecf20Sopenharmony_ci#define MAX_KEY KEY(MAX_KEY_INODE, MAX_KEY_OFFSET, 0) 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci#define KEY_START(k) (KEY_OFFSET(k) - KEY_SIZE(k)) 848c2ecf20Sopenharmony_ci#define START_KEY(k) KEY(KEY_INODE(k), KEY_START(k), 0) 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci#define PTR_DEV_BITS 12 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ciPTR_FIELD(PTR_DEV, 51, PTR_DEV_BITS) 898c2ecf20Sopenharmony_ciPTR_FIELD(PTR_OFFSET, 8, 43) 908c2ecf20Sopenharmony_ciPTR_FIELD(PTR_GEN, 0, 8) 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci#define PTR_CHECK_DEV ((1 << PTR_DEV_BITS) - 1) 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci#define MAKE_PTR(gen, offset, dev) \ 958c2ecf20Sopenharmony_ci ((((__u64) dev) << 51) | ((__u64) offset) << 8 | gen) 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci/* Bkey utility code */ 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_cistatic inline unsigned long bkey_u64s(const struct bkey *k) 1008c2ecf20Sopenharmony_ci{ 1018c2ecf20Sopenharmony_ci return (sizeof(struct bkey) / sizeof(__u64)) + KEY_PTRS(k); 1028c2ecf20Sopenharmony_ci} 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_cistatic inline unsigned long bkey_bytes(const struct bkey *k) 1058c2ecf20Sopenharmony_ci{ 1068c2ecf20Sopenharmony_ci return bkey_u64s(k) * sizeof(__u64); 1078c2ecf20Sopenharmony_ci} 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci#define bkey_copy(_dest, _src) memcpy(_dest, _src, bkey_bytes(_src)) 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_cistatic inline void bkey_copy_key(struct bkey *dest, const struct bkey *src) 1128c2ecf20Sopenharmony_ci{ 1138c2ecf20Sopenharmony_ci SET_KEY_INODE(dest, KEY_INODE(src)); 1148c2ecf20Sopenharmony_ci SET_KEY_OFFSET(dest, KEY_OFFSET(src)); 1158c2ecf20Sopenharmony_ci} 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cistatic inline struct bkey *bkey_next(const struct bkey *k) 1188c2ecf20Sopenharmony_ci{ 1198c2ecf20Sopenharmony_ci __u64 *d = (void *) k; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci return (struct bkey *) (d + bkey_u64s(k)); 1228c2ecf20Sopenharmony_ci} 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_cistatic inline struct bkey *bkey_idx(const struct bkey *k, unsigned int nr_keys) 1258c2ecf20Sopenharmony_ci{ 1268c2ecf20Sopenharmony_ci __u64 *d = (void *) k; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci return (struct bkey *) (d + nr_keys); 1298c2ecf20Sopenharmony_ci} 1308c2ecf20Sopenharmony_ci/* Enough for a key with 6 pointers */ 1318c2ecf20Sopenharmony_ci#define BKEY_PAD 8 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci#define BKEY_PADDED(key) \ 1348c2ecf20Sopenharmony_ci union { struct bkey key; __u64 key ## _pad[BKEY_PAD]; } 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci/* Superblock */ 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci/* Version 0: Cache device 1398c2ecf20Sopenharmony_ci * Version 1: Backing device 1408c2ecf20Sopenharmony_ci * Version 2: Seed pointer into btree node checksum 1418c2ecf20Sopenharmony_ci * Version 3: Cache device with new UUID format 1428c2ecf20Sopenharmony_ci * Version 4: Backing device with data offset 1438c2ecf20Sopenharmony_ci */ 1448c2ecf20Sopenharmony_ci#define BCACHE_SB_VERSION_CDEV 0 1458c2ecf20Sopenharmony_ci#define BCACHE_SB_VERSION_BDEV 1 1468c2ecf20Sopenharmony_ci#define BCACHE_SB_VERSION_CDEV_WITH_UUID 3 1478c2ecf20Sopenharmony_ci#define BCACHE_SB_VERSION_BDEV_WITH_OFFSET 4 1488c2ecf20Sopenharmony_ci#define BCACHE_SB_VERSION_CDEV_WITH_FEATURES 5 1498c2ecf20Sopenharmony_ci#define BCACHE_SB_VERSION_BDEV_WITH_FEATURES 6 1508c2ecf20Sopenharmony_ci#define BCACHE_SB_MAX_VERSION 6 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci#define SB_SECTOR 8 1538c2ecf20Sopenharmony_ci#define SB_OFFSET (SB_SECTOR << SECTOR_SHIFT) 1548c2ecf20Sopenharmony_ci#define SB_SIZE 4096 1558c2ecf20Sopenharmony_ci#define SB_LABEL_SIZE 32 1568c2ecf20Sopenharmony_ci#define SB_JOURNAL_BUCKETS 256U 1578c2ecf20Sopenharmony_ci/* SB_JOURNAL_BUCKETS must be divisible by BITS_PER_LONG */ 1588c2ecf20Sopenharmony_ci#define MAX_CACHES_PER_SET 8 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci#define BDEV_DATA_START_DEFAULT 16 /* sectors */ 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_cistruct cache_sb_disk { 1638c2ecf20Sopenharmony_ci __le64 csum; 1648c2ecf20Sopenharmony_ci __le64 offset; /* sector where this sb was written */ 1658c2ecf20Sopenharmony_ci __le64 version; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ci __u8 magic[16]; 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci __u8 uuid[16]; 1708c2ecf20Sopenharmony_ci union { 1718c2ecf20Sopenharmony_ci __u8 set_uuid[16]; 1728c2ecf20Sopenharmony_ci __le64 set_magic; 1738c2ecf20Sopenharmony_ci }; 1748c2ecf20Sopenharmony_ci __u8 label[SB_LABEL_SIZE]; 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci __le64 flags; 1778c2ecf20Sopenharmony_ci __le64 seq; 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci __le64 feature_compat; 1808c2ecf20Sopenharmony_ci __le64 feature_incompat; 1818c2ecf20Sopenharmony_ci __le64 feature_ro_compat; 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ci __le64 pad[5]; 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci union { 1868c2ecf20Sopenharmony_ci struct { 1878c2ecf20Sopenharmony_ci /* Cache devices */ 1888c2ecf20Sopenharmony_ci __le64 nbuckets; /* device size */ 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci __le16 block_size; /* sectors */ 1918c2ecf20Sopenharmony_ci __le16 bucket_size; /* sectors */ 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci __le16 nr_in_set; 1948c2ecf20Sopenharmony_ci __le16 nr_this_dev; 1958c2ecf20Sopenharmony_ci }; 1968c2ecf20Sopenharmony_ci struct { 1978c2ecf20Sopenharmony_ci /* Backing devices */ 1988c2ecf20Sopenharmony_ci __le64 data_offset; 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci /* 2018c2ecf20Sopenharmony_ci * block_size from the cache device section is still used by 2028c2ecf20Sopenharmony_ci * backing devices, so don't add anything here until we fix 2038c2ecf20Sopenharmony_ci * things to not need it for backing devices anymore 2048c2ecf20Sopenharmony_ci */ 2058c2ecf20Sopenharmony_ci }; 2068c2ecf20Sopenharmony_ci }; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci __le32 last_mount; /* time overflow in y2106 */ 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci __le16 first_bucket; 2118c2ecf20Sopenharmony_ci union { 2128c2ecf20Sopenharmony_ci __le16 njournal_buckets; 2138c2ecf20Sopenharmony_ci __le16 keys; 2148c2ecf20Sopenharmony_ci }; 2158c2ecf20Sopenharmony_ci __le64 d[SB_JOURNAL_BUCKETS]; /* journal buckets */ 2168c2ecf20Sopenharmony_ci __le16 obso_bucket_size_hi; /* obsoleted */ 2178c2ecf20Sopenharmony_ci}; 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci/* 2208c2ecf20Sopenharmony_ci * This is for in-memory bcache super block. 2218c2ecf20Sopenharmony_ci * NOTE: cache_sb is NOT exactly mapping to cache_sb_disk, the member 2228c2ecf20Sopenharmony_ci * size, ordering and even whole struct size may be different 2238c2ecf20Sopenharmony_ci * from cache_sb_disk. 2248c2ecf20Sopenharmony_ci */ 2258c2ecf20Sopenharmony_cistruct cache_sb { 2268c2ecf20Sopenharmony_ci __u64 offset; /* sector where this sb was written */ 2278c2ecf20Sopenharmony_ci __u64 version; 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci __u8 magic[16]; 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci __u8 uuid[16]; 2328c2ecf20Sopenharmony_ci union { 2338c2ecf20Sopenharmony_ci __u8 set_uuid[16]; 2348c2ecf20Sopenharmony_ci __u64 set_magic; 2358c2ecf20Sopenharmony_ci }; 2368c2ecf20Sopenharmony_ci __u8 label[SB_LABEL_SIZE]; 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_ci __u64 flags; 2398c2ecf20Sopenharmony_ci __u64 seq; 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci __u64 feature_compat; 2428c2ecf20Sopenharmony_ci __u64 feature_incompat; 2438c2ecf20Sopenharmony_ci __u64 feature_ro_compat; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci union { 2468c2ecf20Sopenharmony_ci struct { 2478c2ecf20Sopenharmony_ci /* Cache devices */ 2488c2ecf20Sopenharmony_ci __u64 nbuckets; /* device size */ 2498c2ecf20Sopenharmony_ci 2508c2ecf20Sopenharmony_ci __u16 block_size; /* sectors */ 2518c2ecf20Sopenharmony_ci __u16 nr_in_set; 2528c2ecf20Sopenharmony_ci __u16 nr_this_dev; 2538c2ecf20Sopenharmony_ci __u32 bucket_size; /* sectors */ 2548c2ecf20Sopenharmony_ci }; 2558c2ecf20Sopenharmony_ci struct { 2568c2ecf20Sopenharmony_ci /* Backing devices */ 2578c2ecf20Sopenharmony_ci __u64 data_offset; 2588c2ecf20Sopenharmony_ci 2598c2ecf20Sopenharmony_ci /* 2608c2ecf20Sopenharmony_ci * block_size from the cache device section is still used by 2618c2ecf20Sopenharmony_ci * backing devices, so don't add anything here until we fix 2628c2ecf20Sopenharmony_ci * things to not need it for backing devices anymore 2638c2ecf20Sopenharmony_ci */ 2648c2ecf20Sopenharmony_ci }; 2658c2ecf20Sopenharmony_ci }; 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci __u32 last_mount; /* time overflow in y2106 */ 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_ci __u16 first_bucket; 2708c2ecf20Sopenharmony_ci union { 2718c2ecf20Sopenharmony_ci __u16 njournal_buckets; 2728c2ecf20Sopenharmony_ci __u16 keys; 2738c2ecf20Sopenharmony_ci }; 2748c2ecf20Sopenharmony_ci __u64 d[SB_JOURNAL_BUCKETS]; /* journal buckets */ 2758c2ecf20Sopenharmony_ci}; 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_cistatic inline _Bool SB_IS_BDEV(const struct cache_sb *sb) 2788c2ecf20Sopenharmony_ci{ 2798c2ecf20Sopenharmony_ci return sb->version == BCACHE_SB_VERSION_BDEV 2808c2ecf20Sopenharmony_ci || sb->version == BCACHE_SB_VERSION_BDEV_WITH_OFFSET 2818c2ecf20Sopenharmony_ci || sb->version == BCACHE_SB_VERSION_BDEV_WITH_FEATURES; 2828c2ecf20Sopenharmony_ci} 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_ciBITMASK(CACHE_SYNC, struct cache_sb, flags, 0, 1); 2858c2ecf20Sopenharmony_ciBITMASK(CACHE_DISCARD, struct cache_sb, flags, 1, 1); 2868c2ecf20Sopenharmony_ciBITMASK(CACHE_REPLACEMENT, struct cache_sb, flags, 2, 3); 2878c2ecf20Sopenharmony_ci#define CACHE_REPLACEMENT_LRU 0U 2888c2ecf20Sopenharmony_ci#define CACHE_REPLACEMENT_FIFO 1U 2898c2ecf20Sopenharmony_ci#define CACHE_REPLACEMENT_RANDOM 2U 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ciBITMASK(BDEV_CACHE_MODE, struct cache_sb, flags, 0, 4); 2928c2ecf20Sopenharmony_ci#define CACHE_MODE_WRITETHROUGH 0U 2938c2ecf20Sopenharmony_ci#define CACHE_MODE_WRITEBACK 1U 2948c2ecf20Sopenharmony_ci#define CACHE_MODE_WRITEAROUND 2U 2958c2ecf20Sopenharmony_ci#define CACHE_MODE_NONE 3U 2968c2ecf20Sopenharmony_ciBITMASK(BDEV_STATE, struct cache_sb, flags, 61, 2); 2978c2ecf20Sopenharmony_ci#define BDEV_STATE_NONE 0U 2988c2ecf20Sopenharmony_ci#define BDEV_STATE_CLEAN 1U 2998c2ecf20Sopenharmony_ci#define BDEV_STATE_DIRTY 2U 3008c2ecf20Sopenharmony_ci#define BDEV_STATE_STALE 3U 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_ci/* 3038c2ecf20Sopenharmony_ci * Magic numbers 3048c2ecf20Sopenharmony_ci * 3058c2ecf20Sopenharmony_ci * The various other data structures have their own magic numbers, which are 3068c2ecf20Sopenharmony_ci * xored with the first part of the cache set's UUID 3078c2ecf20Sopenharmony_ci */ 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ci#define JSET_MAGIC 0x245235c1a3625032ULL 3108c2ecf20Sopenharmony_ci#define PSET_MAGIC 0x6750e15f87337f91ULL 3118c2ecf20Sopenharmony_ci#define BSET_MAGIC 0x90135c78b99e07f5ULL 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_cistatic inline __u64 jset_magic(struct cache_sb *sb) 3148c2ecf20Sopenharmony_ci{ 3158c2ecf20Sopenharmony_ci return sb->set_magic ^ JSET_MAGIC; 3168c2ecf20Sopenharmony_ci} 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_cistatic inline __u64 pset_magic(struct cache_sb *sb) 3198c2ecf20Sopenharmony_ci{ 3208c2ecf20Sopenharmony_ci return sb->set_magic ^ PSET_MAGIC; 3218c2ecf20Sopenharmony_ci} 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_cistatic inline __u64 bset_magic(struct cache_sb *sb) 3248c2ecf20Sopenharmony_ci{ 3258c2ecf20Sopenharmony_ci return sb->set_magic ^ BSET_MAGIC; 3268c2ecf20Sopenharmony_ci} 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_ci/* 3298c2ecf20Sopenharmony_ci * Journal 3308c2ecf20Sopenharmony_ci * 3318c2ecf20Sopenharmony_ci * On disk format for a journal entry: 3328c2ecf20Sopenharmony_ci * seq is monotonically increasing; every journal entry has its own unique 3338c2ecf20Sopenharmony_ci * sequence number. 3348c2ecf20Sopenharmony_ci * 3358c2ecf20Sopenharmony_ci * last_seq is the oldest journal entry that still has keys the btree hasn't 3368c2ecf20Sopenharmony_ci * flushed to disk yet. 3378c2ecf20Sopenharmony_ci * 3388c2ecf20Sopenharmony_ci * version is for on disk format changes. 3398c2ecf20Sopenharmony_ci */ 3408c2ecf20Sopenharmony_ci 3418c2ecf20Sopenharmony_ci#define BCACHE_JSET_VERSION_UUIDv1 1 3428c2ecf20Sopenharmony_ci#define BCACHE_JSET_VERSION_UUID 1 /* Always latest UUID format */ 3438c2ecf20Sopenharmony_ci#define BCACHE_JSET_VERSION 1 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_cistruct jset { 3468c2ecf20Sopenharmony_ci __u64 csum; 3478c2ecf20Sopenharmony_ci __u64 magic; 3488c2ecf20Sopenharmony_ci __u64 seq; 3498c2ecf20Sopenharmony_ci __u32 version; 3508c2ecf20Sopenharmony_ci __u32 keys; 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ci __u64 last_seq; 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_ci BKEY_PADDED(uuid_bucket); 3558c2ecf20Sopenharmony_ci BKEY_PADDED(btree_root); 3568c2ecf20Sopenharmony_ci __u16 btree_level; 3578c2ecf20Sopenharmony_ci __u16 pad[3]; 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_ci __u64 prio_bucket[MAX_CACHES_PER_SET]; 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ci union { 3628c2ecf20Sopenharmony_ci struct bkey start[0]; 3638c2ecf20Sopenharmony_ci __u64 d[0]; 3648c2ecf20Sopenharmony_ci }; 3658c2ecf20Sopenharmony_ci}; 3668c2ecf20Sopenharmony_ci 3678c2ecf20Sopenharmony_ci/* Bucket prios/gens */ 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_cistruct prio_set { 3708c2ecf20Sopenharmony_ci __u64 csum; 3718c2ecf20Sopenharmony_ci __u64 magic; 3728c2ecf20Sopenharmony_ci __u64 seq; 3738c2ecf20Sopenharmony_ci __u32 version; 3748c2ecf20Sopenharmony_ci __u32 pad; 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_ci __u64 next_bucket; 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ci struct bucket_disk { 3798c2ecf20Sopenharmony_ci __u16 prio; 3808c2ecf20Sopenharmony_ci __u8 gen; 3818c2ecf20Sopenharmony_ci } __attribute((packed)) data[]; 3828c2ecf20Sopenharmony_ci}; 3838c2ecf20Sopenharmony_ci 3848c2ecf20Sopenharmony_ci/* UUIDS - per backing device/flash only volume metadata */ 3858c2ecf20Sopenharmony_ci 3868c2ecf20Sopenharmony_cistruct uuid_entry { 3878c2ecf20Sopenharmony_ci union { 3888c2ecf20Sopenharmony_ci struct { 3898c2ecf20Sopenharmony_ci __u8 uuid[16]; 3908c2ecf20Sopenharmony_ci __u8 label[32]; 3918c2ecf20Sopenharmony_ci __u32 first_reg; /* time overflow in y2106 */ 3928c2ecf20Sopenharmony_ci __u32 last_reg; 3938c2ecf20Sopenharmony_ci __u32 invalidated; 3948c2ecf20Sopenharmony_ci 3958c2ecf20Sopenharmony_ci __u32 flags; 3968c2ecf20Sopenharmony_ci /* Size of flash only volumes */ 3978c2ecf20Sopenharmony_ci __u64 sectors; 3988c2ecf20Sopenharmony_ci }; 3998c2ecf20Sopenharmony_ci 4008c2ecf20Sopenharmony_ci __u8 pad[128]; 4018c2ecf20Sopenharmony_ci }; 4028c2ecf20Sopenharmony_ci}; 4038c2ecf20Sopenharmony_ci 4048c2ecf20Sopenharmony_ciBITMASK(UUID_FLASH_ONLY, struct uuid_entry, flags, 0, 1); 4058c2ecf20Sopenharmony_ci 4068c2ecf20Sopenharmony_ci/* Btree nodes */ 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_ci/* Version 1: Seed pointer into btree node checksum 4098c2ecf20Sopenharmony_ci */ 4108c2ecf20Sopenharmony_ci#define BCACHE_BSET_CSUM 1 4118c2ecf20Sopenharmony_ci#define BCACHE_BSET_VERSION 1 4128c2ecf20Sopenharmony_ci 4138c2ecf20Sopenharmony_ci/* 4148c2ecf20Sopenharmony_ci * Btree nodes 4158c2ecf20Sopenharmony_ci * 4168c2ecf20Sopenharmony_ci * On disk a btree node is a list/log of these; within each set the keys are 4178c2ecf20Sopenharmony_ci * sorted 4188c2ecf20Sopenharmony_ci */ 4198c2ecf20Sopenharmony_cistruct bset { 4208c2ecf20Sopenharmony_ci __u64 csum; 4218c2ecf20Sopenharmony_ci __u64 magic; 4228c2ecf20Sopenharmony_ci __u64 seq; 4238c2ecf20Sopenharmony_ci __u32 version; 4248c2ecf20Sopenharmony_ci __u32 keys; 4258c2ecf20Sopenharmony_ci 4268c2ecf20Sopenharmony_ci union { 4278c2ecf20Sopenharmony_ci struct bkey start[0]; 4288c2ecf20Sopenharmony_ci __u64 d[0]; 4298c2ecf20Sopenharmony_ci }; 4308c2ecf20Sopenharmony_ci}; 4318c2ecf20Sopenharmony_ci 4328c2ecf20Sopenharmony_ci/* OBSOLETE */ 4338c2ecf20Sopenharmony_ci 4348c2ecf20Sopenharmony_ci/* UUIDS - per backing device/flash only volume metadata */ 4358c2ecf20Sopenharmony_ci 4368c2ecf20Sopenharmony_cistruct uuid_entry_v0 { 4378c2ecf20Sopenharmony_ci __u8 uuid[16]; 4388c2ecf20Sopenharmony_ci __u8 label[32]; 4398c2ecf20Sopenharmony_ci __u32 first_reg; 4408c2ecf20Sopenharmony_ci __u32 last_reg; 4418c2ecf20Sopenharmony_ci __u32 invalidated; 4428c2ecf20Sopenharmony_ci __u32 pad; 4438c2ecf20Sopenharmony_ci}; 4448c2ecf20Sopenharmony_ci 4458c2ecf20Sopenharmony_ci#endif /* _LINUX_BCACHE_H */ 446