bcachefs: bch2_journal_noflush_seq()
Add bch2_journal_noflush_seq(), for telling the journal that entries before a given sequence number should not be flushes - to be used by an upcoming allocator optimization. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
This commit is contained in:
parent
c7ce813fe4
commit
5b2e599f50
@ -704,6 +704,44 @@ int bch2_journal_flush(struct journal *j)
|
||||
return bch2_journal_flush_seq(j, seq);
|
||||
}
|
||||
|
||||
/*
|
||||
* bch2_journal_noflush_seq - tell the journal not to issue any flushes before
|
||||
* @seq
|
||||
*/
|
||||
bool bch2_journal_noflush_seq(struct journal *j, u64 seq)
|
||||
{
|
||||
struct bch_fs *c = container_of(j, struct bch_fs, journal);
|
||||
u64 unwritten_seq;
|
||||
bool ret = false;
|
||||
|
||||
if (!(c->sb.features & (1ULL << BCH_FEATURE_journal_no_flush)))
|
||||
return false;
|
||||
|
||||
if (seq <= c->journal.flushed_seq_ondisk)
|
||||
return false;
|
||||
|
||||
spin_lock(&j->lock);
|
||||
if (seq <= c->journal.flushed_seq_ondisk)
|
||||
goto out;
|
||||
|
||||
for (unwritten_seq = last_unwritten_seq(j);
|
||||
unwritten_seq < 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 == last_unwritten_seq(j) && !buf->noflush)
|
||||
goto out;
|
||||
|
||||
buf->noflush = true;
|
||||
}
|
||||
|
||||
ret = true;
|
||||
out:
|
||||
spin_unlock(&j->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* block/unlock the journal: */
|
||||
|
||||
void bch2_journal_unblock(struct journal *j)
|
||||
|
@ -475,6 +475,7 @@ void bch2_journal_flush_async(struct journal *, struct closure *);
|
||||
|
||||
int bch2_journal_flush_seq(struct journal *, u64);
|
||||
int bch2_journal_flush(struct journal *);
|
||||
bool bch2_journal_noflush_seq(struct journal *, u64);
|
||||
int bch2_journal_meta(struct journal *);
|
||||
|
||||
void bch2_journal_halt(struct journal *);
|
||||
|
@ -1396,9 +1396,10 @@ void bch2_journal_write(struct closure *cl)
|
||||
|
||||
spin_lock(&j->lock);
|
||||
if (c->sb.features & (1ULL << BCH_FEATURE_journal_no_flush) &&
|
||||
!w->must_flush &&
|
||||
(w->noflush ||
|
||||
(!w->must_flush &&
|
||||
(jiffies - j->last_flush_write) < msecs_to_jiffies(c->opts.journal_flush_delay) &&
|
||||
test_bit(JOURNAL_MAY_SKIP_FLUSH, &j->flags)) {
|
||||
test_bit(JOURNAL_MAY_SKIP_FLUSH, &j->flags)))) {
|
||||
w->noflush = true;
|
||||
SET_JSET_NO_FLUSH(jset, true);
|
||||
jset->last_seq = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user