]> www.infradead.org Git - linux.git/commitdiff
bcachefs: bch2_journal_noflush_seq() now takes [start, end)
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 8 Dec 2024 05:28:16 +0000 (00:28 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:22 +0000 (01:36 -0500)
Harder to screw up if we're explicit about the range, and more correct
as journal reservations can be outstanding on multiple journal entries
simultaneously.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_background.c
fs/bcachefs/journal.c
fs/bcachefs/journal.h

index 62069231c63b29e7800349a411b7f5fb90ada672..9ae567402b03cade6fe87fee2ee15d34e652359d 100644 (file)
@@ -953,7 +953,9 @@ int bch2_trigger_alloc(struct btree_trans *trans,
                 */
                if (is_empty_delta > 0) {
                        if (new_a->journal_seq == transaction_seq ||
-                           bch2_journal_noflush_seq(&c->journal, new_a->journal_seq))
+                           bch2_journal_noflush_seq(&c->journal,
+                                                    new_a->journal_seq,
+                                                    transaction_seq))
                                new_a->journal_seq = 0;
                        else {
                                new_a->journal_seq = transaction_seq;
index 04a9ccf76d757aff32467db8073f1be170e8ea66..2cd20114b74b98611119b3aa84f835c297ffc7f5 100644 (file)
@@ -807,10 +807,11 @@ int bch2_journal_flush(struct journal *j)
 }
 
 /*
- * bch2_journal_noflush_seq - tell the journal not to issue any flushes before
+ * bch2_journal_noflush_seq - ask the journal not to issue any flushes in the
+ * range [start, end)
  * @seq
  */
-bool bch2_journal_noflush_seq(struct journal *j, u64 seq)
+bool bch2_journal_noflush_seq(struct journal *j, u64 start, u64 end)
 {
        struct bch_fs *c = container_of(j, struct bch_fs, journal);
        u64 unwritten_seq;
@@ -819,15 +820,15 @@ bool bch2_journal_noflush_seq(struct journal *j, u64 seq)
        if (!(c->sb.features & (1ULL << BCH_FEATURE_journal_no_flush)))
                return false;
 
-       if (seq <= c->journal.flushed_seq_ondisk)
+       if (c->journal.flushed_seq_ondisk >= start)
                return false;
 
        spin_lock(&j->lock);
-       if (seq <= c->journal.flushed_seq_ondisk)
+       if (c->journal.flushed_seq_ondisk >= start)
                goto out;
 
        for (unwritten_seq = journal_last_unwritten_seq(j);
-            unwritten_seq < seq;
+            unwritten_seq < end;
             unwritten_seq++) {
                struct journal_buf *buf = journal_seq_to_buf(j, unwritten_seq);
 
index a6a2e888c59bd4c659e9d6930da6754ed625ff03..cb0df0663946bb46a1b34b277342b0ef04efef55 100644 (file)
@@ -404,7 +404,7 @@ void bch2_journal_flush_async(struct journal *, struct closure *);
 
 int bch2_journal_flush_seq(struct journal *, u64, unsigned);
 int bch2_journal_flush(struct journal *);
-bool bch2_journal_noflush_seq(struct journal *, u64);
+bool bch2_journal_noflush_seq(struct journal *, u64, u64);
 int bch2_journal_meta(struct journal *);
 
 void bch2_journal_halt(struct journal *);