]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/bcachefs.h
Update bcachefs sources to bdf6d7c135 fixup! bcachefs: Kill journal buf bloom filter
[bcachefs-tools-debian] / libbcachefs / bcachefs.h
index 943487f2c6f5c4d79080c133a2a53596615093da..2eced20667fa585d7299bd7341b1467034b8f3d7 100644 (file)
  */
 
 #undef pr_fmt
+#ifdef __KERNEL__
 #define pr_fmt(fmt) "bcachefs: %s() " fmt "\n", __func__
+#else
+#define pr_fmt(fmt) "%s() " fmt "\n", __func__
+#endif
 
 #include <linux/backing-dev-defs.h>
 #include <linux/bug.h>
 #define bch2_fmt(_c, fmt)              "bcachefs (%s): " fmt "\n", ((_c)->name)
 #define bch2_fmt_inum(_c, _inum, fmt)  "bcachefs (%s inum %llu): " fmt "\n", ((_c)->name), (_inum)
 #else
-#define bch2_fmt(_c, fmt)              "%s: " fmt "\n", ((_c)->name)
-#define bch2_fmt_inum(_c, _inum, fmt)  "%s inum %llu: " fmt "\n", ((_c)->name), (_inum)
+#define bch2_fmt(_c, fmt)              fmt "\n"
+#define bch2_fmt_inum(_c, _inum, fmt)  "inum %llu: " fmt "\n", (_inum)
 #endif
 
 #define bch_info(c, fmt, ...) \
@@ -277,9 +281,6 @@ do {                                                                        \
                "significantly affect performance")                     \
        BCH_DEBUG_PARAM(debug_check_iterators,                          \
                "Enables extra verification for btree iterators")       \
-       BCH_DEBUG_PARAM(debug_check_bkeys,                              \
-               "Run bkey_debugcheck (primarily checking GC/allocation "\
-               "information) when iterating over keys")                \
        BCH_DEBUG_PARAM(debug_check_btree_accounting,                   \
                "Verify btree accounting for keys within a node")       \
        BCH_DEBUG_PARAM(journal_seq_verify,                             \
@@ -351,6 +352,7 @@ enum bch_time_stats {
 #include "alloc_types.h"
 #include "btree_types.h"
 #include "buckets_types.h"
+#include "buckets_waiting_for_journal_types.h"
 #include "clock_types.h"
 #include "ec_types.h"
 #include "journal_types.h"
@@ -389,6 +391,10 @@ enum gc_phase {
        GC_PHASE_BTREE_reflink,
        GC_PHASE_BTREE_subvolumes,
        GC_PHASE_BTREE_snapshots,
+       GC_PHASE_BTREE_lru,
+       GC_PHASE_BTREE_freespace,
+       GC_PHASE_BTREE_need_discard,
+       GC_PHASE_BTREE_backpointers,
 
        GC_PHASE_PENDING_DELETE,
 };
@@ -432,6 +438,7 @@ struct bch_dev {
        struct bch_sb_handle    disk_sb;
        struct bch_sb           *sb_read_scratch;
        int                     sb_write_error;
+       dev_t                   dev;
 
        struct bch_devs_mask    self;
 
@@ -444,7 +451,9 @@ struct bch_dev {
         * gc_lock, for device resize - holding any is sufficient for access:
         * Or rcu_read_lock(), but only for ptr_stale():
         */
-       struct bucket_array __rcu *buckets[2];
+       struct bucket_array __rcu *buckets_gc;
+       struct bucket_gens __rcu *bucket_gens;
+       u8                      *oldest_gen;
        unsigned long           *buckets_nouse;
        struct rw_semaphore     bucket_lock;
 
@@ -453,32 +462,17 @@ struct bch_dev {
        struct bch_dev_usage __percpu   *usage_gc;
 
        /* Allocator: */
-       struct task_struct __rcu *alloc_thread;
+       u64                     new_fs_bucket_idx;
 
-       /*
-        * free: Buckets that are ready to be used
-        *
-        * free_inc: Incoming buckets - these are buckets that currently have
-        * cached data in them, and we can't reuse them until after we write
-        * their new gen to disk. After prio_write() finishes writing the new
-        * gens/prios, they'll be moved to the free list (and possibly discarded
-        * in the process)
-        */
-       alloc_fifo              free[RESERVE_NR];
-       alloc_fifo              free_inc;
        unsigned                nr_open_buckets;
+       unsigned                nr_btree_reserve;
 
        open_bucket_idx_t       open_buckets_partial[OPEN_BUCKETS_COUNT];
        open_bucket_idx_t       open_buckets_partial_nr;
 
-       size_t                  fifo_last_bucket;
-
        size_t                  inc_gen_needs_gc;
        size_t                  inc_gen_really_needs_gc;
-
-       enum allocator_states   allocator_state;
-
-       alloc_heap              alloc_heap;
+       size_t                  buckets_waiting_on_journal;
 
        atomic64_t              rebalance_work;
 
@@ -500,17 +494,8 @@ struct bch_dev {
 
 enum {
        /* startup: */
-       BCH_FS_INITIALIZED,
-       BCH_FS_ALLOC_READ_DONE,
-       BCH_FS_ALLOC_CLEAN,
-       BCH_FS_ALLOCATOR_RUNNING,
-       BCH_FS_ALLOCATOR_STOPPING,
-       BCH_FS_INITIAL_GC_DONE,
-       BCH_FS_INITIAL_GC_UNFIXED,
-       BCH_FS_TOPOLOGY_REPAIR_DONE,
-       BCH_FS_BTREE_INTERIOR_REPLAY_DONE,
-       BCH_FS_FSCK_DONE,
        BCH_FS_STARTED,
+       BCH_FS_MAY_GO_RW,
        BCH_FS_RW,
        BCH_FS_WAS_RW,
 
@@ -518,26 +503,26 @@ enum {
        BCH_FS_STOPPING,
        BCH_FS_EMERGENCY_RO,
        BCH_FS_WRITE_DISABLE_COMPLETE,
+       BCH_FS_CLEAN_SHUTDOWN,
+
+       /* fsck passes: */
+       BCH_FS_TOPOLOGY_REPAIR_DONE,
+       BCH_FS_INITIAL_GC_DONE,         /* kill when we enumerate fsck passes */
+       BCH_FS_CHECK_LRUS_DONE,
+       BCH_FS_CHECK_ALLOC_TO_LRU_REFS_DONE,
+       BCH_FS_FSCK_DONE,
+       BCH_FS_INITIAL_GC_UNFIXED,      /* kill when we enumerate fsck errors */
+       BCH_FS_NEED_ANOTHER_GC,
 
        /* errors: */
        BCH_FS_ERROR,
        BCH_FS_TOPOLOGY_ERROR,
        BCH_FS_ERRORS_FIXED,
        BCH_FS_ERRORS_NOT_FIXED,
-
-       /* misc: */
-       BCH_FS_NEED_ANOTHER_GC,
-       BCH_FS_DELETED_NODES,
-       BCH_FS_NEED_ALLOC_WRITE,
-       BCH_FS_REBUILD_REPLICAS,
-       BCH_FS_HOLD_BTREE_WRITES,
 };
 
 struct btree_debug {
        unsigned                id;
-       struct dentry           *btree;
-       struct dentry           *btree_format;
-       struct dentry           *failed;
 };
 
 struct bch_fs_pcpu {
@@ -558,10 +543,17 @@ struct journal_keys {
                enum btree_id   btree_id:8;
                unsigned        level:8;
                bool            allocated;
+               bool            overwritten;
                struct bkey_i   *k;
                u32             journal_seq;
                u32             journal_offset;
        }                       *d;
+       /*
+        * Gap buffer: instead of all the empty space in the array being at the
+        * end of the buffer - from @nr to @size - the empty space is at @gap.
+        * This means that sequential insertions are O(n) instead of O(n^2).
+        */
+       size_t                  gap;
        size_t                  nr;
        size_t                  size;
        u64                     journal_seq_base;
@@ -593,6 +585,7 @@ struct bch_fs {
 
        struct list_head        list;
        struct kobject          kobj;
+       struct kobject          counters_kobj;
        struct kobject          internal;
        struct kobject          opts_dir;
        struct kobject          time_stats;
@@ -664,7 +657,7 @@ struct bch_fs {
        struct mutex            snapshot_table_lock;
        struct work_struct      snapshot_delete_work;
        struct work_struct      snapshot_wait_for_pagecache_and_delete_work;
-       struct snapshot_id_list snapshots_unlinked;
+       snapshot_id_list        snapshots_unlinked;
        struct mutex            snapshots_unlinked_lock;
 
        /* BTREE CACHE */
@@ -707,6 +700,7 @@ struct bch_fs {
        bool                    btree_trans_barrier_initialized;
 
        struct btree_key_cache  btree_key_cache;
+       unsigned                btree_key_cache_btrees;
 
        struct workqueue_struct *btree_update_wq;
        struct workqueue_struct *btree_io_complete_wq;
@@ -755,10 +749,12 @@ struct bch_fs {
        struct closure_waitlist freelist_wait;
        u64                     blocked_allocate;
        u64                     blocked_allocate_open_bucket;
+
        open_bucket_idx_t       open_buckets_freelist;
        open_bucket_idx_t       open_buckets_nr_free;
        struct closure_waitlist open_buckets_wait;
        struct open_bucket      open_buckets[OPEN_BUCKETS_COUNT];
+       open_bucket_idx_t       open_buckets_hash[OPEN_BUCKETS_COUNT];
 
        struct write_point      btree_write_point;
        struct write_point      rebalance_write_point;
@@ -768,6 +764,10 @@ struct bch_fs {
        struct mutex            write_points_hash_lock;
        unsigned                write_points_nr;
 
+       struct buckets_waiting_for_journal buckets_waiting_for_journal;
+       struct work_struct      discard_work;
+       struct work_struct      invalidate_work;
+
        /* GARBAGE COLLECTION */
        struct task_struct      *gc_thread;
        atomic_t                kick_gc;
@@ -793,6 +793,7 @@ struct bch_fs {
         * it's not while a gc is in progress.
         */
        struct rw_semaphore     gc_lock;
+       struct mutex            gc_gens_lock;
 
        /* IO PATH */
        struct semaphore        io_in_flight;
@@ -855,7 +856,6 @@ struct bch_fs {
        u64                     reflink_hint;
        reflink_gc_table        reflink_gc_table;
        size_t                  reflink_gc_nr;
-       size_t                  reflink_gc_idx;
 
        /* VFS IO PATH - fs-io.c */
        struct bio_set          writepage_bioset;
@@ -876,7 +876,8 @@ struct bch_fs {
        struct bch_memquota_type quotas[QTYP_NR];
 
        /* DEBUG JUNK */
-       struct dentry           *debug;
+       struct dentry           *fs_debug_dir;
+       struct dentry           *btree_debug_dir;
        struct btree_debug      btree_debug[BTREE_ID_NR];
        struct btree            *verify_data;
        struct btree_node       *verify_ondisk;
@@ -894,16 +895,21 @@ struct bch_fs {
        mempool_t               btree_bounce_pool;
 
        struct journal          journal;
-       struct list_head        journal_entries;
+       GENRADIX(struct journal_replay *) journal_entries;
+       u64                     journal_entries_base_seq;
        struct journal_keys     journal_keys;
        struct list_head        journal_iters;
 
        u64                     last_bucket_seq_cleanup;
 
-       /* The rest of this all shows up in sysfs */
+       /* TODO rewrite as counters - The rest of this all shows up in sysfs */
        atomic_long_t           read_realloc_races;
        atomic_long_t           extent_migrate_done;
        atomic_long_t           extent_migrate_raced;
+       atomic_long_t           bucket_alloc_fail;
+
+       u64                     counters_on_mount[BCH_COUNTER_NR];
+       u64 __percpu            *counters;
 
        unsigned                btree_gc_periodic:1;
        unsigned                copy_gc_enabled:1;
@@ -940,6 +946,11 @@ static inline size_t btree_sectors(const struct bch_fs *c)
        return c->opts.btree_node_size >> 9;
 }
 
+static inline bool btree_id_cached(const struct bch_fs *c, enum btree_id btree)
+{
+       return c->btree_key_cache_btrees & (1U << btree);
+}
+
 static inline struct timespec64 bch2_time_to_timespec(const struct bch_fs *c, s64 time)
 {
        struct timespec64 t;