bcachefs: Don't rejournal keys in key cache flush
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 14 Nov 2023 02:12:35 +0000 (21:12 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 1 Jan 2024 16:47:37 +0000 (11:47 -0500)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_key_cache.c

index 4599e999c2317aaa62939fc992df1c625da762b1..6d98018912be31325b998d77096494fd2e87fce3 100644 (file)
@@ -645,11 +645,19 @@ static int btree_key_cache_flush_pos(struct btree_trans *trans,
        if (journal_seq && ck->journal.seq != journal_seq)
                goto out;
 
+       trans->journal_res.seq = ck->journal.seq;
+
        /*
-        * Since journal reclaim depends on us making progress here, and the
-        * allocator/copygc depend on journal reclaim making progress, we need
-        * to be using alloc reserves:
+        * If we're at the end of the journal, we really want to free up space
+        * in the journal right away - we don't want to pin that old journal
+        * sequence number with a new btree node write, we want to re-journal
+        * the update
         */
+       if (ck->journal.seq == journal_last_seq(j))
+               commit_flags |= BCH_WATERMARK_reclaim;
+       else
+               commit_flags |= BCH_TRANS_COMMIT_no_journal_res;
+
        ret   = bch2_btree_iter_traverse(&b_iter) ?:
                bch2_trans_update(trans, &b_iter, ck->k,
                                  BTREE_UPDATE_KEY_CACHE_RECLAIM|
@@ -658,9 +666,6 @@ static int btree_key_cache_flush_pos(struct btree_trans *trans,
                bch2_trans_commit(trans, NULL, NULL,
                                  BCH_TRANS_COMMIT_no_check_rw|
                                  BCH_TRANS_COMMIT_no_enospc|
-                                 (ck->journal.seq == journal_last_seq(j)
-                                  ? BCH_WATERMARK_reclaim
-                                  : 0)|
                                  commit_flags);
 
        bch2_fs_fatal_err_on(ret &&