diff options
Diffstat (limited to 'fs/bcachefs/data_update.c')
-rw-r--r-- | fs/bcachefs/data_update.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/fs/bcachefs/data_update.c b/fs/bcachefs/data_update.c index 9b44f11fb0d9..106db6264314 100644 --- a/fs/bcachefs/data_update.c +++ b/fs/bcachefs/data_update.c @@ -380,6 +380,15 @@ restart_drop_extra_replicas: printbuf_exit(&buf); } + ret = bch2_verify_extent_has_replicas(trans, insert); + if (ret == -1) { + print_update(m, k, bkey_i_to_s_c(&new->k_i), insert, "durability > 2"); + bch2_fs_inconsistent(c, "durability > 2"); + goto err; + } + if (ret) + goto err; + printbuf_reset(&journal_msg); prt_str(&journal_msg, bch2_data_update_type_strs[m->type]); @@ -397,13 +406,14 @@ restart_drop_extra_replicas: BCH_TRANS_COMMIT_no_check_rw| BCH_TRANS_COMMIT_no_enospc| m->data_opts.btree_insert_flags); - if (!ret) { - bch2_btree_iter_set_pos(trans, &iter, next_pos); + if (ret) + goto err; - this_cpu_add(c->counters[BCH_COUNTER_io_move_finish], new->k.size); - if (trace_io_move_finish_enabled()) - trace_io_move_finish2(m, &new->k_i, insert); - } + bch2_btree_iter_set_pos(&iter, next_pos); + + this_cpu_add(c->counters[BCH_COUNTER_io_move_finish], new->k.size); + if (trace_io_move_finish_enabled()) + trace_io_move_finish2(m, &new->k_i, insert); err: if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) ret = 0; |