bcachefs: Erasure coding fixes & refactoring
[linux-block.git] / fs / bcachefs / btree_types.h
index 345a06bac0fe6749f7dad555b0805da499f6fedd..e51e3c7868de069465d7a6fb1f3c179f91c45e2e 100644 (file)
@@ -57,7 +57,7 @@ struct btree_write {
 
 struct btree_alloc {
        struct open_buckets     ob;
-       BKEY_PADDED(k);
+       __BKEY_PADDED(k, BKEY_BTREE_PTR_VAL_U64s_MAX);
 };
 
 struct btree_bkey_cached_common {
@@ -94,7 +94,7 @@ struct btree {
        struct btree_nr_keys    nr;
        u16                     sib_u64s[2];
        u16                     whiteout_u64s;
-       u8                      page_order;
+       u8                      byte_order;
        u8                      unpack_fn_len;
 
        /*
@@ -130,10 +130,6 @@ struct btree {
 
        struct btree_write      writes[2];
 
-#ifdef CONFIG_BCACHEFS_DEBUG
-       bool                    *expensive_debug_checks;
-#endif
-
        /* Key/pointer for this btree node */
        __BKEY_PADDED(key, BKEY_BTREE_PTR_VAL_U64s_MAX);
 };
@@ -162,6 +158,7 @@ struct btree_cache {
        /* Number of elements in live + freeable lists */
        unsigned                used;
        unsigned                reserve;
+       atomic_t                dirty;
        struct shrinker         shrink;
 
        /*
@@ -283,6 +280,11 @@ btree_iter_type(const struct btree_iter *iter)
        return iter->flags & BTREE_ITER_TYPE;
 }
 
+static inline bool btree_iter_is_cached(const struct btree_iter *iter)
+{
+       return btree_iter_type(iter) == BTREE_ITER_CACHED;
+}
+
 static inline struct btree_iter_level *iter_l(struct btree_iter *iter)
 {
        return iter->l + iter->level;
@@ -291,16 +293,24 @@ static inline struct btree_iter_level *iter_l(struct btree_iter *iter)
 struct btree_key_cache {
        struct mutex            lock;
        struct rhashtable       table;
+       bool                    table_init_done;
        struct list_head        freed;
        struct list_head        clean;
+       struct list_head        dirty;
+       struct shrinker         shrink;
+
+       size_t                  nr_freed;
+       size_t                  nr_keys;
+       size_t                  nr_dirty;
 };
 
 struct bkey_cached_key {
        u32                     btree_id;
        struct bpos             pos;
-} __packed;
+} __attribute__((packed, aligned(4)));
 
-#define BKEY_CACHED_DIRTY              0
+#define BKEY_CACHED_ACCESSED           0
+#define BKEY_CACHED_DIRTY              1
 
 struct bkey_cached {
        struct btree_bkey_cached_common c;
@@ -308,6 +318,7 @@ struct bkey_cached {
        unsigned long           flags;
        u8                      u64s;
        bool                    valid;
+       u32                     btree_trans_barrier_seq;
        struct bkey_cached_key  key;
 
        struct rhash_head       hash;
@@ -344,21 +355,19 @@ struct btree_trans {
        pid_t                   pid;
 #endif
        unsigned long           ip;
+       int                     srcu_idx;
 
-       u64                     iters_linked;
-       u64                     iters_live;
-       u64                     iters_touched;
-
-       u8                      nr_iters;
        u8                      nr_updates;
        u8                      nr_updates2;
-       u8                      size;
        unsigned                used_mempool:1;
        unsigned                error:1;
        unsigned                nounlock:1;
-       unsigned                need_reset:1;
        unsigned                in_traverse_all:1;
 
+       u64                     iters_linked;
+       u64                     iters_live;
+       u64                     iters_touched;
+
        unsigned                mem_top;
        unsigned                mem_bytes;
        void                    *mem;
@@ -380,10 +389,6 @@ struct btree_trans {
        unsigned                journal_u64s;
        unsigned                journal_preres_u64s;
        struct replicas_delta_list *fs_usage_deltas;
-
-       struct btree_iter       iters_onstack[2];
-       struct btree_insert_entry updates_onstack[2];
-       struct btree_insert_entry updates2_onstack[2];
 };
 
 #define BTREE_FLAG(flag)                                               \
@@ -409,11 +414,12 @@ enum btree_flags {
        BTREE_NODE_dying,
        BTREE_NODE_fake,
        BTREE_NODE_old_extent_overwrite,
+       BTREE_NODE_need_rewrite,
+       BTREE_NODE_never_write,
 };
 
 BTREE_FLAG(read_in_flight);
 BTREE_FLAG(read_error);
-BTREE_FLAG(dirty);
 BTREE_FLAG(need_write);
 BTREE_FLAG(noevict);
 BTREE_FLAG(write_idx);
@@ -423,6 +429,8 @@ BTREE_FLAG(just_written);
 BTREE_FLAG(dying);
 BTREE_FLAG(fake);
 BTREE_FLAG(old_extent_overwrite);
+BTREE_FLAG(need_rewrite);
+BTREE_FLAG(never_write);
 
 static inline struct btree_write *btree_current_write(struct btree *b)
 {
@@ -568,6 +576,16 @@ static inline bool btree_node_is_extents(struct btree *b)
        return btree_node_type_is_extents(btree_node_type(b));
 }
 
+static inline enum btree_node_type btree_iter_key_type(struct btree_iter *iter)
+{
+       return __btree_node_type(iter->level, iter->btree_id);
+}
+
+static inline bool btree_iter_is_extents(struct btree_iter *iter)
+{
+       return btree_node_type_is_extents(btree_iter_key_type(iter));
+}
+
 #define BTREE_NODE_TYPE_HAS_TRIGGERS                   \
        ((1U << BKEY_TYPE_EXTENTS)|                     \
         (1U << BKEY_TYPE_ALLOC)|                       \
@@ -579,11 +597,11 @@ static inline bool btree_node_is_extents(struct btree *b)
 #define BTREE_NODE_TYPE_HAS_TRANS_TRIGGERS             \
        ((1U << BKEY_TYPE_EXTENTS)|                     \
         (1U << BKEY_TYPE_INODES)|                      \
+        (1U << BKEY_TYPE_EC)|                          \
         (1U << BKEY_TYPE_REFLINK))
 
 enum btree_trigger_flags {
        __BTREE_TRIGGER_NORUN,          /* Don't run triggers at all */
-       __BTREE_TRIGGER_NOOVERWRITES,   /* Don't run triggers on overwrites */
 
        __BTREE_TRIGGER_INSERT,
        __BTREE_TRIGGER_OVERWRITE,
@@ -591,12 +609,10 @@ enum btree_trigger_flags {
 
        __BTREE_TRIGGER_GC,
        __BTREE_TRIGGER_BUCKET_INVALIDATE,
-       __BTREE_TRIGGER_ALLOC_READ,
        __BTREE_TRIGGER_NOATOMIC,
 };
 
 #define BTREE_TRIGGER_NORUN            (1U << __BTREE_TRIGGER_NORUN)
-#define BTREE_TRIGGER_NOOVERWRITES     (1U << __BTREE_TRIGGER_NOOVERWRITES)
 
 #define BTREE_TRIGGER_INSERT           (1U << __BTREE_TRIGGER_INSERT)
 #define BTREE_TRIGGER_OVERWRITE                (1U << __BTREE_TRIGGER_OVERWRITE)
@@ -604,7 +620,6 @@ enum btree_trigger_flags {
 
 #define BTREE_TRIGGER_GC               (1U << __BTREE_TRIGGER_GC)
 #define BTREE_TRIGGER_BUCKET_INVALIDATE        (1U << __BTREE_TRIGGER_BUCKET_INVALIDATE)
-#define BTREE_TRIGGER_ALLOC_READ       (1U << __BTREE_TRIGGER_ALLOC_READ)
 #define BTREE_TRIGGER_NOATOMIC         (1U << __BTREE_TRIGGER_NOATOMIC)
 
 static inline bool btree_node_type_needs_gc(enum btree_node_type type)
@@ -634,6 +649,7 @@ enum btree_insert_ret {
        BTREE_INSERT_ENOSPC,
        BTREE_INSERT_NEED_MARK_REPLICAS,
        BTREE_INSERT_NEED_JOURNAL_RES,
+       BTREE_INSERT_NEED_JOURNAL_RECLAIM,
 };
 
 enum btree_gc_coalesce_fail_reason {