]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/journal_types.h
Update bcachefs sources to 3e0c5b0722 fixup! bcachefs: Btree write buffer
[bcachefs-tools-debian] / libbcachefs / journal_types.h
index 9953663e3a634a5606b0359b8870da3e6c81378b..0e6bde669b3e6577b542a4243a11a061693ffc8c 100644 (file)
@@ -21,8 +21,12 @@ struct journal_buf {
        struct jset             *data;
 
        __BKEY_PADDED(key, BCH_REPLICAS_MAX);
+       struct bch_devs_list    devs_written;
 
        struct closure_waitlist wait;
+       u64                     last_seq;       /* copy of data->last_seq */
+       long                    expires;
+       u64                     flush_time;
 
        unsigned                buf_size;       /* size in bytes of @data */
        unsigned                sectors;        /* maximum size for current entry */
@@ -31,8 +35,7 @@ struct journal_buf {
        unsigned                u64s_reserved;
        bool                    noflush;        /* write has already been kicked off, and was noflush */
        bool                    must_flush;     /* something wants a flush */
-       /* bloom filter: */
-       unsigned long           has_inode[1024 / sizeof(unsigned long)];
+       bool                    separate_flush;
 };
 
 /*
@@ -42,6 +45,7 @@ struct journal_buf {
 
 struct journal_entry_pin_list {
        struct list_head                list;
+       struct list_head                key_cache_list;
        struct list_head                flushed;
        atomic_t                        count;
        struct bch_devs_list            devs;
@@ -49,7 +53,7 @@ struct journal_entry_pin_list {
 
 struct journal;
 struct journal_entry_pin;
-typedef void (*journal_pin_flush_fn)(struct journal *j,
+typedef int (*journal_pin_flush_fn)(struct journal *j,
                                struct journal_entry_pin *, u64);
 
 struct journal_entry_pin {
@@ -104,8 +108,9 @@ union journal_preres_state {
        };
 
        struct {
-               u32             reserved;
-               u32             remaining;
+               u64             waiting:1,
+                               reserved:31,
+                               remaining:32;
        };
 };
 
@@ -136,52 +141,78 @@ enum journal_space_from {
        journal_space_nr,
 };
 
-/*
- * JOURNAL_NEED_WRITE - current (pending) journal entry should be written ASAP,
- * either because something's waiting on the write to complete or because it's
- * been dirty too long and the timer's expired.
- */
-
-enum {
+enum journal_flags {
        JOURNAL_REPLAY_DONE,
        JOURNAL_STARTED,
-       JOURNAL_RECLAIM_STARTED,
-       JOURNAL_NEED_WRITE,
-       JOURNAL_MAY_GET_UNRESERVED,
        JOURNAL_MAY_SKIP_FLUSH,
+       JOURNAL_NEED_FLUSH_WRITE,
+};
+
+#define JOURNAL_WATERMARKS()           \
+       x(any)                          \
+       x(copygc)                       \
+       x(reserved)
+
+enum journal_watermark {
+#define x(n)   JOURNAL_WATERMARK_##n,
+       JOURNAL_WATERMARKS()
+#undef x
+};
+
+#define JOURNAL_WATERMARK_MASK 3
+
+/* Reasons we may fail to get a journal reservation: */
+#define JOURNAL_ERRORS()               \
+       x(ok)                           \
+       x(blocked)                      \
+       x(max_in_flight)                \
+       x(journal_full)                 \
+       x(journal_pin_full)             \
+       x(journal_stuck)                \
+       x(insufficient_devices)
+
+enum journal_errors {
+#define x(n)   JOURNAL_ERR_##n,
+       JOURNAL_ERRORS()
+#undef x
 };
 
+typedef DARRAY(u64)            darray_u64;
+
 /* Embedded in struct bch_fs */
 struct journal {
        /* Fastpath stuff up front: */
-
-       unsigned long           flags;
+       struct {
 
        union journal_res_state reservations;
+       enum journal_watermark  watermark;
+
+       union journal_preres_state prereserved;
+
+       } __aligned(SMP_CACHE_BYTES);
+
+       unsigned long           flags;
 
        /* Max size of current journal entry */
        unsigned                cur_entry_u64s;
        unsigned                cur_entry_sectors;
 
+       /* Reserved space in journal entry to be used just prior to write */
+       unsigned                entry_u64s_reserved;
+
+
        /*
         * 0, or -ENOSPC if waiting on journal reclaim, or -EROFS if
         * insufficient devices:
         */
-       enum {
-               cur_entry_ok,
-               cur_entry_blocked,
-               cur_entry_journal_full,
-               cur_entry_journal_pin_full,
-               cur_entry_journal_stuck,
-               cur_entry_insufficient_devices,
-       }                       cur_entry_error;
-
-       union journal_preres_state prereserved;
-
-       /* Reserved space in journal entry to be used just prior to write */
-       unsigned                entry_u64s_reserved;
+       enum journal_errors     cur_entry_error;
 
        unsigned                buf_size_want;
+       /*
+        * We may queue up some things to be journalled (log messages) before
+        * the journal has actually started - stash them here:
+        */
+       darray_u64              early_journal_entries;
 
        /*
         * Two journal entries -- one is currently open for new entries, the
@@ -242,39 +273,43 @@ struct journal {
        spinlock_t              err_lock;
 
        struct mutex            reclaim_lock;
+       /*
+        * Used for waiting until journal reclaim has freed up space in the
+        * journal:
+        */
+       wait_queue_head_t       reclaim_wait;
        struct task_struct      *reclaim_thread;
        bool                    reclaim_kicked;
+       unsigned long           next_reclaim;
        u64                     nr_direct_reclaim;
        u64                     nr_background_reclaim;
 
        unsigned long           last_flushed;
        struct journal_entry_pin *flush_in_progress;
+       bool                    flush_in_progress_dropped;
        wait_queue_head_t       pin_flush_wait;
 
        /* protects advancing ja->discard_idx: */
        struct mutex            discard_lock;
        bool                    can_discard;
 
-       unsigned                write_delay_ms;
-       unsigned                reclaim_delay_ms;
        unsigned long           last_flush_write;
 
        u64                     res_get_blocked_start;
-       u64                     need_write_time;
        u64                     write_start_time;
 
        u64                     nr_flush_writes;
        u64                     nr_noflush_writes;
 
-       struct time_stats       *write_time;
-       struct time_stats       *delay_time;
-       struct time_stats       *blocked_time;
-       struct time_stats       *flush_seq_time;
+       struct bch2_time_stats  *flush_write_time;
+       struct bch2_time_stats  *noflush_write_time;
+       struct bch2_time_stats  *blocked_time;
+       struct bch2_time_stats  *flush_seq_time;
 
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
        struct lockdep_map      res_map;
 #endif
-};
+} __aligned(SMP_CACHE_BYTES);
 
 /*
  * Embedded in struct bch_dev. First three fields refer to the array of journal