+/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _BUCKETS_TYPES_H
#define _BUCKETS_TYPES_H
+#include "bcachefs_format.h"
#include "util.h"
-enum bucket_data_type {
- BUCKET_DATA = 0,
- BUCKET_BTREE,
- BUCKET_PRIOS,
- BUCKET_JOURNAL,
- BUCKET_SB,
-};
+#define BUCKET_JOURNAL_SEQ_BITS 16
struct bucket_mark {
union {
- struct {
- u64 counter;
- };
+ atomic64_t v;
struct {
- u8 gen;
-
- unsigned gen_valid:1;
- unsigned journal_seq_valid:1;
-
- /*
- * If this bucket had metadata while at the current generation
- * number, the allocator must increment its gen before we reuse
- * it:
- */
- unsigned had_metadata:1;
-
- unsigned owned_by_allocator:1;
-
- unsigned data_type:3;
-
- unsigned nouse:1;
-
- u16 dirty_sectors;
- u16 cached_sectors;
-
- /*
- * low bits of journal sequence number when this bucket was most
- * recently modified: if journal_seq_valid is set, this bucket
- * can't be reused until the journal sequence number written to
- * disk is >= the bucket's journal sequence number:
- */
- u16 journal_seq;
+ u8 gen;
+ u8 data_type:3,
+ owned_by_allocator:1,
+ journal_seq_valid:1,
+ stripe:1;
+ u16 dirty_sectors;
+ u16 cached_sectors;
+
+ /*
+ * low bits of journal sequence number when this bucket was most
+ * recently modified: if journal_seq_valid is set, this bucket can't be
+ * reused until the journal sequence number written to disk is >= the
+ * bucket's journal sequence number:
+ */
+ u16 journal_seq;
};
};
};
struct bucket {
- u16 prio[2];
-
union {
struct bucket_mark _mark;
const struct bucket_mark mark;
};
-};
-enum s_compressed {
- S_COMPRESSED,
- S_UNCOMPRESSED,
- S_COMPRESSED_NR,
+ u16 io_time[2];
+ u8 oldest_gen;
+ u8 gc_gen;
+ unsigned gen_valid:1;
};
-enum s_alloc {
- S_META,
- S_DIRTY,
- S_CACHED,
- S_ALLOC_NR,
+struct bucket_array {
+ struct rcu_head rcu;
+ u16 first_bucket;
+ size_t nbuckets;
+ struct bucket b[];
};
struct bch_dev_usage {
- u64 buckets_dirty;
- u64 buckets_cached;
- u64 buckets_meta;
+ u64 buckets[BCH_DATA_NR];
u64 buckets_alloc;
+ u64 buckets_ec;
+ u64 buckets_unavailable;
- u64 sectors[S_ALLOC_NR];
+ /* _compressed_ sectors: */
+ u64 sectors[BCH_DATA_NR];
+ u64 sectors_fragmented;
};
struct bch_fs_usage {
/* all fields are in units of 512 byte sectors: */
- u64 s[S_COMPRESSED_NR][S_ALLOC_NR];
- u64 persistent_reserved;
+
u64 online_reserved;
- u64 available_cache;
+
+ /* fields after online_reserved are cleared/recalculated by gc: */
+ u64 gc_start[0];
+
+ u64 hidden;
+ u64 btree;
+ u64 data;
+ u64 cached;
+ u64 reserved;
+ u64 nr_inodes;
+
+ /* XXX: add stats for compression ratio */
+#if 0
+ u64 uncompressed;
+ u64 compressed;
+#endif
+
+ /* broken out: */
+
+ u64 persistent_reserved[BCH_REPLICAS_MAX];
+ u64 replicas[];
};
-struct bucket_heap_entry {
- size_t bucket;
- struct bucket_mark mark;
+struct bch_fs_usage_short {
+ u64 capacity;
+ u64 used;
+ u64 free;
+ u64 nr_inodes;
};
-typedef HEAP(struct bucket_heap_entry) bucket_heap;
+struct replicas_delta {
+ s64 delta;
+ struct bch_replicas_entry r;
+} __packed;
+
+struct replicas_delta_list {
+ unsigned size;
+ unsigned used;
+
+ struct {} memset_start;
+ u64 nr_inodes;
+ u64 persistent_reserved[BCH_REPLICAS_MAX];
+ struct {} memset_end;
+ struct replicas_delta d[0];
+};
/*
* A reservation for space on disk:
*/
struct disk_reservation {
- u64 sectors;
- u32 gen;
- unsigned nr_replicas;
+ u64 sectors;
+ u32 gen;
+ unsigned nr_replicas;
};
+struct copygc_heap_entry {
+ u8 gen;
+ u32 sectors;
+ u64 offset;
+};
+
+typedef HEAP(struct copygc_heap_entry) copygc_heap;
+
#endif /* _BUCKETS_TYPES_H */