Loading fs/bcachefs/btree_write_buffer.c +14 −5 Original line number Diff line number Diff line Loading @@ -495,10 +495,6 @@ static int bch2_journal_keys_to_write_buffer(struct bch_fs *c, struct journal_bu entry->type = BCH_JSET_ENTRY_btree_keys; } spin_lock(&c->journal.lock); buf->need_flush_to_write_buffer = false; spin_unlock(&c->journal.lock); out: ret = bch2_journal_keys_to_write_buffer_end(c, &dst) ?: ret; return ret; Loading @@ -508,11 +504,24 @@ static int fetch_wb_keys_from_journal(struct bch_fs *c, u64 max_seq) { struct journal *j = &c->journal; struct journal_buf *buf; bool blocked; int ret = 0; while (!ret && (buf = bch2_next_write_buffer_flush_journal_buf(j, max_seq))) { while (!ret && (buf = bch2_next_write_buffer_flush_journal_buf(j, max_seq, &blocked))) { ret = bch2_journal_keys_to_write_buffer(c, buf); if (!blocked && !ret) { spin_lock(&j->lock); buf->need_flush_to_write_buffer = false; spin_unlock(&j->lock); } mutex_unlock(&j->buf_lock); if (blocked) { bch2_journal_unblock(j); break; } } return ret; Loading fs/bcachefs/journal.c +20 −7 Original line number Diff line number Diff line Loading @@ -908,6 +908,8 @@ static void __bch2_journal_block(struct journal *j) new.v = old.v; new.cur_entry_offset = JOURNAL_ENTRY_BLOCKED_VAL; } while (!atomic64_try_cmpxchg(&j->reservations.counter, &old.v, new.v)); journal_cur_buf(j)->data->u64s = cpu_to_le32(old.cur_entry_offset); } } Loading @@ -920,7 +922,8 @@ void bch2_journal_block(struct journal *j) journal_quiesce(j); } static struct journal_buf *__bch2_next_write_buffer_flush_journal_buf(struct journal *j, u64 max_seq) static struct journal_buf *__bch2_next_write_buffer_flush_journal_buf(struct journal *j, u64 max_seq, bool *blocked) { struct journal_buf *ret = NULL; Loading @@ -937,13 +940,17 @@ static struct journal_buf *__bch2_next_write_buffer_flush_journal_buf(struct jou struct journal_buf *buf = j->buf + idx; if (buf->need_flush_to_write_buffer) { if (seq == journal_cur_seq(j)) __journal_entry_close(j, JOURNAL_ENTRY_CLOSED_VAL, true); union journal_res_state s; s.v = atomic64_read_acquire(&j->reservations.counter); ret = journal_state_count(s, idx) unsigned open = seq == journal_cur_seq(j) && __journal_entry_is_open(s); if (open && !*blocked) { __bch2_journal_block(j); *blocked = true; } ret = journal_state_count(s, idx) > open ? ERR_PTR(-EAGAIN) : buf; break; Loading @@ -956,11 +963,17 @@ static struct journal_buf *__bch2_next_write_buffer_flush_journal_buf(struct jou return ret; } struct journal_buf *bch2_next_write_buffer_flush_journal_buf(struct journal *j, u64 max_seq) struct journal_buf *bch2_next_write_buffer_flush_journal_buf(struct journal *j, u64 max_seq, bool *blocked) { struct journal_buf *ret; *blocked = false; wait_event(j->wait, (ret = __bch2_next_write_buffer_flush_journal_buf(j, max_seq, blocked)) != ERR_PTR(-EAGAIN)); if (IS_ERR_OR_NULL(ret) && *blocked) bch2_journal_unblock(j); wait_event(j->wait, (ret = __bch2_next_write_buffer_flush_journal_buf(j, max_seq)) != ERR_PTR(-EAGAIN)); return ret; } Loading fs/bcachefs/journal.h +1 −1 Original line number Diff line number Diff line Loading @@ -425,7 +425,7 @@ static inline void bch2_journal_set_replay_done(struct journal *j) void bch2_journal_unblock(struct journal *); void bch2_journal_block(struct journal *); struct journal_buf *bch2_next_write_buffer_flush_journal_buf(struct journal *j, u64 max_seq); struct journal_buf *bch2_next_write_buffer_flush_journal_buf(struct journal *, u64, bool *); void __bch2_journal_debug_to_text(struct printbuf *, struct journal *); void bch2_journal_debug_to_text(struct printbuf *, struct journal *); Loading Loading
fs/bcachefs/btree_write_buffer.c +14 −5 Original line number Diff line number Diff line Loading @@ -495,10 +495,6 @@ static int bch2_journal_keys_to_write_buffer(struct bch_fs *c, struct journal_bu entry->type = BCH_JSET_ENTRY_btree_keys; } spin_lock(&c->journal.lock); buf->need_flush_to_write_buffer = false; spin_unlock(&c->journal.lock); out: ret = bch2_journal_keys_to_write_buffer_end(c, &dst) ?: ret; return ret; Loading @@ -508,11 +504,24 @@ static int fetch_wb_keys_from_journal(struct bch_fs *c, u64 max_seq) { struct journal *j = &c->journal; struct journal_buf *buf; bool blocked; int ret = 0; while (!ret && (buf = bch2_next_write_buffer_flush_journal_buf(j, max_seq))) { while (!ret && (buf = bch2_next_write_buffer_flush_journal_buf(j, max_seq, &blocked))) { ret = bch2_journal_keys_to_write_buffer(c, buf); if (!blocked && !ret) { spin_lock(&j->lock); buf->need_flush_to_write_buffer = false; spin_unlock(&j->lock); } mutex_unlock(&j->buf_lock); if (blocked) { bch2_journal_unblock(j); break; } } return ret; Loading
fs/bcachefs/journal.c +20 −7 Original line number Diff line number Diff line Loading @@ -908,6 +908,8 @@ static void __bch2_journal_block(struct journal *j) new.v = old.v; new.cur_entry_offset = JOURNAL_ENTRY_BLOCKED_VAL; } while (!atomic64_try_cmpxchg(&j->reservations.counter, &old.v, new.v)); journal_cur_buf(j)->data->u64s = cpu_to_le32(old.cur_entry_offset); } } Loading @@ -920,7 +922,8 @@ void bch2_journal_block(struct journal *j) journal_quiesce(j); } static struct journal_buf *__bch2_next_write_buffer_flush_journal_buf(struct journal *j, u64 max_seq) static struct journal_buf *__bch2_next_write_buffer_flush_journal_buf(struct journal *j, u64 max_seq, bool *blocked) { struct journal_buf *ret = NULL; Loading @@ -937,13 +940,17 @@ static struct journal_buf *__bch2_next_write_buffer_flush_journal_buf(struct jou struct journal_buf *buf = j->buf + idx; if (buf->need_flush_to_write_buffer) { if (seq == journal_cur_seq(j)) __journal_entry_close(j, JOURNAL_ENTRY_CLOSED_VAL, true); union journal_res_state s; s.v = atomic64_read_acquire(&j->reservations.counter); ret = journal_state_count(s, idx) unsigned open = seq == journal_cur_seq(j) && __journal_entry_is_open(s); if (open && !*blocked) { __bch2_journal_block(j); *blocked = true; } ret = journal_state_count(s, idx) > open ? ERR_PTR(-EAGAIN) : buf; break; Loading @@ -956,11 +963,17 @@ static struct journal_buf *__bch2_next_write_buffer_flush_journal_buf(struct jou return ret; } struct journal_buf *bch2_next_write_buffer_flush_journal_buf(struct journal *j, u64 max_seq) struct journal_buf *bch2_next_write_buffer_flush_journal_buf(struct journal *j, u64 max_seq, bool *blocked) { struct journal_buf *ret; *blocked = false; wait_event(j->wait, (ret = __bch2_next_write_buffer_flush_journal_buf(j, max_seq, blocked)) != ERR_PTR(-EAGAIN)); if (IS_ERR_OR_NULL(ret) && *blocked) bch2_journal_unblock(j); wait_event(j->wait, (ret = __bch2_next_write_buffer_flush_journal_buf(j, max_seq)) != ERR_PTR(-EAGAIN)); return ret; } Loading
fs/bcachefs/journal.h +1 −1 Original line number Diff line number Diff line Loading @@ -425,7 +425,7 @@ static inline void bch2_journal_set_replay_done(struct journal *j) void bch2_journal_unblock(struct journal *); void bch2_journal_block(struct journal *); struct journal_buf *bch2_next_write_buffer_flush_journal_buf(struct journal *j, u64 max_seq); struct journal_buf *bch2_next_write_buffer_flush_journal_buf(struct journal *, u64, bool *); void __bch2_journal_debug_to_text(struct printbuf *, struct journal *); void bch2_journal_debug_to_text(struct printbuf *, struct journal *); Loading