]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/bcachefs.h
Update bcachefs sources to 91e6c3e0d5 bcachefs: Gap buffer for journal keys
[bcachefs-tools-debian] / libbcachefs / bcachefs.h
index 0e9689f6878afd3062710d9f6b4bd288bf8eef84..ab6df637ee26895678bfea8d18eea7e9da6026e4 100644 (file)
@@ -391,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,
 };
@@ -447,7 +451,7 @@ 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;
@@ -459,34 +463,17 @@ struct bch_dev {
 
        /* Allocator: */
        u64                     new_fs_bucket_idx;
-       struct task_struct __rcu *alloc_thread;
 
-       /*
-        * 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;
        size_t                  buckets_waiting_on_journal;
 
-       enum allocator_states   allocator_state;
-
-       alloc_heap              alloc_heap;
-
        atomic64_t              rebalance_work;
 
        struct journal_device   journal;
@@ -507,16 +494,13 @@ 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_FSCK_DONE,
        BCH_FS_STARTED,
+       BCH_FS_MAY_GO_RW,
        BCH_FS_RW,
        BCH_FS_WAS_RW,
 
@@ -535,14 +519,10 @@ enum {
        BCH_FS_NEED_ANOTHER_GC,
        BCH_FS_DELETED_NODES,
        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 {
@@ -568,6 +548,12 @@ struct journal_keys {
                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;
@@ -670,7 +656,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 */
@@ -778,6 +764,8 @@ struct bch_fs {
        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;
@@ -887,7 +875,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;
@@ -915,6 +904,7 @@ struct bch_fs {
        atomic_long_t           read_realloc_races;
        atomic_long_t           extent_migrate_done;
        atomic_long_t           extent_migrate_raced;
+       atomic_long_t           bucket_alloc_fail;
 
        unsigned                btree_gc_periodic:1;
        unsigned                copy_gc_enabled:1;