X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libbcachefs%2Fjournal_types.h;h=42504e16acb6ccf261a6699b6d468cba7d26a776;hb=9799b119c34d7be1ee96d143209cfe5fc543d92a;hp=071fcb4a842286a35cbac254dc1668ab5ebfeb51;hpb=d34e731082d8fcd710c2af6377a3b7fa927c8451;p=bcachefs-tools-debian diff --git a/libbcachefs/journal_types.h b/libbcachefs/journal_types.h index 071fcb4..42504e1 100644 --- a/libbcachefs/journal_types.h +++ b/libbcachefs/journal_types.h @@ -43,9 +43,15 @@ struct journal_buf { * flushed: */ +enum journal_pin_type { + JOURNAL_PIN_btree, + JOURNAL_PIN_key_cache, + JOURNAL_PIN_other, + JOURNAL_PIN_NR, +}; + struct journal_entry_pin_list { - struct list_head list; - struct list_head key_cache_list; + struct list_head list[JOURNAL_PIN_NR]; struct list_head flushed; atomic_t count; struct bch_devs_list devs; @@ -141,45 +147,65 @@ enum journal_space_from { journal_space_nr, }; -enum { +enum journal_flags { JOURNAL_REPLAY_DONE, JOURNAL_STARTED, - JOURNAL_MAY_GET_UNRESERVED, JOURNAL_MAY_SKIP_FLUSH, + JOURNAL_NEED_FLUSH_WRITE, }; +/* 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 bch_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_max_in_flight, - 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 @@ -268,15 +294,15 @@ struct journal { u64 nr_flush_writes; u64 nr_noflush_writes; - struct time_stats *flush_write_time; - struct time_stats *noflush_write_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