diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-07-20 18:09:44 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-07-20 18:09:44 -0400 |
commit | 44fc32e7ef89d794854409d98d3d1c3fe8fb3580 (patch) | |
tree | 8dd30cbe9ab6ea2178ed6d847176bef3acdcad1c /libbcachefs/btree_write_buffer.c | |
parent | a7b0ba44f04edfddb4db77e962094c061aa4be45 (diff) |
Update bcachefs sources to ee560a3929 bcachefs: Print version, options earlier in startup path
Diffstat (limited to 'libbcachefs/btree_write_buffer.c')
-rw-r--r-- | libbcachefs/btree_write_buffer.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/libbcachefs/btree_write_buffer.c b/libbcachefs/btree_write_buffer.c index 6c30a72e..5f96db53 100644 --- a/libbcachefs/btree_write_buffer.c +++ b/libbcachefs/btree_write_buffer.c @@ -75,7 +75,7 @@ static int bch2_btree_write_buffer_flush_one(struct btree_trans *trans, } return 0; trans_commit: - return bch2_trans_update(trans, iter, &wb->k, 0) ?: + return bch2_trans_update_seq(trans, wb->journal_seq, iter, &wb->k, 0) ?: bch2_trans_commit(trans, NULL, NULL, commit_flags| BTREE_INSERT_NOCHECK_RW| @@ -103,6 +103,32 @@ static union btree_write_buffer_state btree_write_buffer_switch(struct btree_wri return old; } +/* + * Update a btree with a write buffered key using the journal seq of the + * original write buffer insert. + * + * It is not safe to rejournal the key once it has been inserted into the write + * buffer because that may break recovery ordering. For example, the key may + * have already been modified in the active write buffer in a seq that comes + * before the current transaction. If we were to journal this key again and + * crash, recovery would process updates in the wrong order. + */ +static int +btree_write_buffered_insert(struct btree_trans *trans, + struct btree_write_buffered_key *wb) +{ + struct btree_iter iter; + int ret; + + bch2_trans_iter_init(trans, &iter, wb->btree, bkey_start_pos(&wb->k.k), + BTREE_ITER_CACHED|BTREE_ITER_INTENT); + + ret = bch2_btree_iter_traverse(&iter) ?: + bch2_trans_update_seq(trans, wb->journal_seq, &iter, &wb->k, 0); + bch2_trans_iter_exit(trans, &iter); + return ret; +} + int __bch2_btree_write_buffer_flush(struct btree_trans *trans, unsigned commit_flags, bool locked) { @@ -238,7 +264,7 @@ slowpath: commit_flags| BTREE_INSERT_NOFAIL| BTREE_INSERT_JOURNAL_RECLAIM, - __bch2_btree_insert(trans, i->btree, &i->k, 0)); + btree_write_buffered_insert(trans, i)); if (bch2_fs_fatal_err_on(ret, c, "%s: insert error %s", __func__, bch2_err_str(ret))) break; } |