brintos

brintos / linux-shallow public Read only

0
0
Text · 4.2 KiB · 7b6e6c9 Raw
168 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef _BCACHEFS_DISK_ACCOUNTING_FORMAT_H3#define _BCACHEFS_DISK_ACCOUNTING_FORMAT_H4 5#include "replicas_format.h"6 7/*8 * Disk accounting - KEY_TYPE_accounting - on disk format:9 *10 * Here, the key has considerably more structure than a typical key (bpos); an11 * accounting key is 'struct disk_accounting_pos', which is a union of bpos.12 *13 * More specifically: a key is just a muliword integer (where word endianness14 * matches native byte order), so we're treating bpos as an opaque 20 byte15 * integer and mapping bch_accounting_key to that.16 *17 * This is a type-tagged union of all our various subtypes; a disk accounting18 * key can be device counters, replicas counters, et cetera - it's extensible.19 *20 * The value is a list of u64s or s64s; the number of counters is specific to a21 * given accounting type.22 *23 * Unlike with other key types, updates are _deltas_, and the deltas are not24 * resolved until the update to the underlying btree, done by btree write buffer25 * flush or journal replay.26 *27 * Journal replay in particular requires special handling. The journal tracks a28 * range of entries which may possibly have not yet been applied to the btree29 * yet - it does not know definitively whether individual entries are dirty and30 * still need to be applied.31 *32 * To handle this, we use the version field of struct bkey, and give every33 * accounting update a unique version number - a total ordering in time; the34 * version number is derived from the key's position in the journal. Then35 * journal replay can compare the version number of the key from the journal36 * with the version number of the key in the btree to determine if a key needs37 * to be replayed.38 *39 * For this to work, we must maintain this strict time ordering of updates as40 * they are flushed to the btree, both via write buffer flush and via journal41 * replay. This has complications for the write buffer code while journal replay42 * is still in progress; the write buffer cannot flush any accounting keys to43 * the btree until journal replay has finished replaying its accounting keys, or44 * the (newer) version number of the keys from the write buffer will cause45 * updates from journal replay to be lost.46 */47 48struct bch_accounting {49	struct bch_val		v;50	__u64			d[];51};52 53#define BCH_ACCOUNTING_MAX_COUNTERS		354 55#define BCH_DATA_TYPES()		\56	x(free,		0)		\57	x(sb,		1)		\58	x(journal,	2)		\59	x(btree,	3)		\60	x(user,		4)		\61	x(cached,	5)		\62	x(parity,	6)		\63	x(stripe,	7)		\64	x(need_gc_gens,	8)		\65	x(need_discard,	9)		\66	x(unstriped,	10)67 68enum bch_data_type {69#define x(t, n) BCH_DATA_##t,70	BCH_DATA_TYPES()71#undef x72	BCH_DATA_NR73};74 75static inline bool data_type_is_empty(enum bch_data_type type)76{77	switch (type) {78	case BCH_DATA_free:79	case BCH_DATA_need_gc_gens:80	case BCH_DATA_need_discard:81		return true;82	default:83		return false;84	}85}86 87static inline bool data_type_is_hidden(enum bch_data_type type)88{89	switch (type) {90	case BCH_DATA_sb:91	case BCH_DATA_journal:92		return true;93	default:94		return false;95	}96}97 98#define BCH_DISK_ACCOUNTING_TYPES()		\99	x(nr_inodes,		0)		\100	x(persistent_reserved,	1)		\101	x(replicas,		2)		\102	x(dev_data_type,	3)		\103	x(compression,		4)		\104	x(snapshot,		5)		\105	x(btree,		6)		\106	x(rebalance_work,	7)		\107	x(inum,			8)108 109enum disk_accounting_type {110#define x(f, nr)	BCH_DISK_ACCOUNTING_##f	= nr,111	BCH_DISK_ACCOUNTING_TYPES()112#undef x113	BCH_DISK_ACCOUNTING_TYPE_NR,114};115 116struct bch_nr_inodes {117};118 119struct bch_persistent_reserved {120	__u8			nr_replicas;121};122 123struct bch_dev_data_type {124	__u8			dev;125	__u8			data_type;126};127 128struct bch_acct_compression {129	__u8			type;130};131 132struct bch_acct_snapshot {133	__u32			id;134} __packed;135 136struct bch_acct_btree {137	__u32			id;138} __packed;139 140struct bch_acct_inum {141	__u64			inum;142} __packed;143 144struct bch_acct_rebalance_work {145};146 147struct disk_accounting_pos {148	union {149	struct {150		__u8				type;151		union {152		struct bch_nr_inodes		nr_inodes;153		struct bch_persistent_reserved	persistent_reserved;154		struct bch_replicas_entry_v1	replicas;155		struct bch_dev_data_type	dev_data_type;156		struct bch_acct_compression	compression;157		struct bch_acct_snapshot	snapshot;158		struct bch_acct_btree		btree;159		struct bch_acct_rebalance_work	rebalance_work;160		struct bch_acct_inum		inum;161		} __packed;162	} __packed;163		struct bpos			_pad;164	};165};166 167#endif /* _BCACHEFS_DISK_ACCOUNTING_FORMAT_H */168