mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 06:02:05 +00:00
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: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
79162e829b
commit
7efa287526
@ -716,7 +716,7 @@ recheck_need_open:
|
||||
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 @@ recheck_need_open:
|
||||
}
|
||||
|
||||
/*
|
||||
* 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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user