diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/bcachefs/journal.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/journal.h | 22 |
2 files changed, 18 insertions, 6 deletions
diff --git a/fs/bcachefs/journal.c b/fs/bcachefs/journal.c index 210a2b90bb50..be61d43458eb 100644 --- a/fs/bcachefs/journal.c +++ b/fs/bcachefs/journal.c @@ -134,7 +134,7 @@ journal_error_check_stuck(struct journal *j, int error, unsigned flags) /* journal entry close/open: */ -void __bch2_journal_buf_put(struct journal *j) +void bch2_journal_buf_put_final(struct journal *j) { struct bch_fs *c = container_of(j, struct bch_fs, journal); diff --git a/fs/bcachefs/journal.h b/fs/bcachefs/journal.h index 008a2e25a4fa..0a53a2142594 100644 --- a/fs/bcachefs/journal.h +++ b/fs/bcachefs/journal.h @@ -252,9 +252,10 @@ static inline bool journal_entry_empty(struct jset *j) return true; } -void __bch2_journal_buf_put(struct journal *); - -static inline void bch2_journal_buf_put(struct journal *j, unsigned idx) +/* + * Drop reference on a buffer index and return true if the count has hit zero. + */ +static inline union journal_res_state journal_state_buf_put(struct journal *j, unsigned idx) { union journal_res_state s; @@ -264,9 +265,20 @@ static inline void bch2_journal_buf_put(struct journal *j, unsigned idx) .buf2_count = idx == 2, .buf3_count = idx == 3, }).v, &j->reservations.counter); + return s; +} + +void bch2_journal_buf_put_final(struct journal *); - if (!journal_state_count(s, idx) && idx == s.unwritten_idx) - __bch2_journal_buf_put(j); +static inline void bch2_journal_buf_put(struct journal *j, unsigned idx) +{ + union journal_res_state s; + + s = journal_state_buf_put(j, idx); + if (!journal_state_count(s, idx)) { + if (idx == s.unwritten_idx) + bch2_journal_buf_put_final(j); + } } /* |