Commit 7efa2875 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: Fix bch2_journal_noflush_seq()



Improved journal pipelining broke journal_noflush_seq(); it implicitly
assumed only the oldest outstanding journal buf could be in flight, but
that's no longer true.

Make this more straightforward by just setting buf->must_flush whenever
we know a journal buf is going to be flush.

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 79162e82
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -716,7 +716,7 @@ int bch2_journal_flush_seq_async(struct journal *j, u64 seq,
			return ret;

		seq = res.seq;
		buf = j->buf + (seq & JOURNAL_BUF_MASK);
		buf = journal_seq_to_buf(j, seq);
		buf->must_flush = true;

		if (!buf->flush_time) {
@@ -734,8 +734,8 @@ int bch2_journal_flush_seq_async(struct journal *j, u64 seq,
	}

	/*
	 * if write was kicked off without a flush, flush the next sequence
	 * number instead
	 * if write was kicked off without a flush, or if we promised it
	 * wouldn't be a flush, flush the next sequence number instead
	 */
	buf = journal_seq_to_buf(j, seq);
	if (buf->noflush) {
@@ -813,8 +813,8 @@ bool bch2_journal_noflush_seq(struct journal *j, u64 seq)
	     unwritten_seq++) {
		struct journal_buf *buf = journal_seq_to_buf(j, unwritten_seq);

		/* journal write is already in flight, and was a flush write: */
		if (unwritten_seq == journal_last_unwritten_seq(j) && !buf->noflush)
		/* journal flush already in flight, or flush requseted */
		if (buf->must_flush)
			goto out;

		buf->noflush = true;
+1 −0
Original line number Diff line number Diff line
@@ -1936,6 +1936,7 @@ static int bch2_journal_write_pick_flush(struct journal *j, struct journal_buf *

		j->nr_noflush_writes++;
	} else {
		w->must_flush = true;
		j->last_flush_write = jiffies;
		j->nr_flush_writes++;
		clear_bit(JOURNAL_NEED_FLUSH_WRITE, &j->flags);