mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-01-22 00:04:31 +03:00
127 lines
3.0 KiB
C
127 lines
3.0 KiB
C
/*
|
|
* Author: Kent Overstreet <kmo@daterainc.com>
|
|
*
|
|
* GPLv2
|
|
*/
|
|
|
|
#ifndef _BCACHE_H
|
|
#define _BCACHE_H
|
|
|
|
#define BITMASK(name, type, field, offset, size) \
|
|
static inline uint64_t name(const type *k) \
|
|
{ return (k->field >> offset) & ~(((uint64_t) ~0) << size); } \
|
|
\
|
|
static inline void SET_##name(type *k, uint64_t v) \
|
|
{ \
|
|
k->field &= ~(~((uint64_t) ~0 << size) << offset); \
|
|
k->field |= v << offset; \
|
|
}
|
|
|
|
static const char bcache_magic[] = {
|
|
0xc6, 0x85, 0x73, 0xf6, 0x4e, 0x1a, 0x45, 0xca,
|
|
0x82, 0x65, 0xf5, 0x7f, 0x48, 0xba, 0x6d, 0x81 };
|
|
|
|
/*
|
|
* Version 0: Cache device
|
|
* Version 1: Backing device
|
|
* Version 2: Seed pointer into btree node checksum
|
|
* Version 3: Cache device with new UUID format
|
|
* Version 4: Backing device with data offset
|
|
*/
|
|
#define BCACHE_SB_VERSION_CDEV 0
|
|
#define BCACHE_SB_VERSION_BDEV 1
|
|
#define BCACHE_SB_VERSION_CDEV_WITH_UUID 3
|
|
#define BCACHE_SB_VERSION_BDEV_WITH_OFFSET 4
|
|
#define BCACHE_SB_MAX_VERSION 4
|
|
|
|
#define SB_SECTOR 8
|
|
#define SB_LABEL_SIZE 32
|
|
#define SB_JOURNAL_BUCKETS 256U
|
|
#define BDEV_DATA_START_DEFAULT 16 /* sectors */
|
|
#define SB_START (SB_SECTOR * 512)
|
|
|
|
struct cache_sb {
|
|
uint64_t csum;
|
|
uint64_t offset; /* sector where this sb was written */
|
|
uint64_t version;
|
|
|
|
uint8_t magic[16];
|
|
|
|
uint8_t uuid[16];
|
|
union {
|
|
uint8_t set_uuid[16];
|
|
uint64_t set_magic;
|
|
};
|
|
uint8_t label[SB_LABEL_SIZE];
|
|
|
|
uint64_t flags;
|
|
uint64_t seq;
|
|
uint64_t pad[8];
|
|
|
|
union {
|
|
struct {
|
|
/* Cache devices */
|
|
uint64_t nbuckets; /* device size */
|
|
|
|
uint16_t block_size; /* sectors */
|
|
uint16_t bucket_size; /* sectors */
|
|
|
|
uint16_t nr_in_set;
|
|
uint16_t nr_this_dev;
|
|
};
|
|
struct {
|
|
/* Backing devices */
|
|
uint64_t data_offset;
|
|
|
|
/*
|
|
* block_size from the cache device section is still used by
|
|
* backing devices, so don't add anything here until we fix
|
|
* things to not need it for backing devices anymore
|
|
*/
|
|
};
|
|
};
|
|
|
|
uint32_t last_mount; /* time_t */
|
|
|
|
uint16_t first_bucket;
|
|
union {
|
|
uint16_t njournal_buckets;
|
|
uint16_t keys;
|
|
};
|
|
uint64_t d[SB_JOURNAL_BUCKETS]; /* journal buckets */
|
|
};
|
|
|
|
static inline bool SB_IS_BDEV(const struct cache_sb *sb)
|
|
{
|
|
return sb->version == BCACHE_SB_VERSION_BDEV
|
|
|| sb->version == BCACHE_SB_VERSION_BDEV_WITH_OFFSET;
|
|
}
|
|
|
|
BITMASK(CACHE_SYNC, struct cache_sb, flags, 0, 1);
|
|
BITMASK(CACHE_DISCARD, struct cache_sb, flags, 1, 1);
|
|
BITMASK(CACHE_REPLACEMENT, struct cache_sb, flags, 2, 3);
|
|
#define CACHE_REPLACEMENT_LRU 0U
|
|
#define CACHE_REPLACEMENT_FIFO 1U
|
|
#define CACHE_REPLACEMENT_RANDOM 2U
|
|
|
|
BITMASK(BDEV_CACHE_MODE, struct cache_sb, flags, 0, 4);
|
|
#define CACHE_MODE_WRITETHROUGH 0U
|
|
#define CACHE_MODE_WRITEBACK 1U
|
|
#define CACHE_MODE_WRITEAROUND 2U
|
|
#define CACHE_MODE_NONE 3U
|
|
BITMASK(BDEV_STATE, struct cache_sb, flags, 61, 2);
|
|
#define BDEV_STATE_NONE 0U
|
|
#define BDEV_STATE_CLEAN 1U
|
|
#define BDEV_STATE_DIRTY 2U
|
|
#define BDEV_STATE_STALE 3U
|
|
|
|
inline uint64_t crc64(const void *_data, size_t len);
|
|
|
|
#define node(i, j) ((void *) ((i)->d + (j)))
|
|
#define end(i) node(i, (i)->keys)
|
|
|
|
#define csum_set(i) \
|
|
crc64(((void *) (i)) + 8, ((void *) end(i)) - (((void *) (i)) + 8))
|
|
|
|
#endif
|