summaryrefslogtreecommitdiff
path: root/fs/bcachefs/data_update.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/bcachefs/data_update.c')
-rw-r--r--fs/bcachefs/data_update.c45
1 files changed, 25 insertions, 20 deletions
diff --git a/fs/bcachefs/data_update.c b/fs/bcachefs/data_update.c
index ccedc93fe0ef..b7e0e31407bf 100644
--- a/fs/bcachefs/data_update.c
+++ b/fs/bcachefs/data_update.c
@@ -225,7 +225,7 @@ static void trace_io_move_created_rebalance2(struct data_update *m,
trace_io_move_created_rebalance(c, buf.buf);
- this_cpu_inc(c->counters[BCH_COUNTER_io_move_created_rebalance]);
+ count_event(c, io_move_created_rebalance);
}
noinline_for_stack
@@ -258,11 +258,10 @@ static int __bch2_data_update_index_update(struct btree_trans *trans,
struct bch_write_op *op)
{
struct bch_fs *c = op->c;
- struct btree_iter iter;
struct data_update *m = container_of(op, struct data_update, op);
int ret = 0;
- bch2_trans_iter_init(trans, &iter, m->btree_id,
+ CLASS(btree_iter, iter)(trans, m->btree_id,
bkey_start_pos(&bch2_keylist_front(&op->insert_keys)->k),
BTREE_ITER_slots|BTREE_ITER_intent);
@@ -283,7 +282,7 @@ static int __bch2_data_update_index_update(struct btree_trans *trans,
bch2_trans_begin(trans);
- k = bch2_btree_iter_peek_slot(trans, &iter);
+ k = bch2_btree_iter_peek_slot(&iter);
ret = bkey_err(k);
if (ret)
goto err;
@@ -456,22 +455,16 @@ restart_drop_extra_replicas:
if (ret)
goto err;
- bch2_btree_iter_set_pos(trans, &iter, next_pos);
+ 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);
+ goto next;
err:
- if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
- ret = 0;
- if (ret)
+ if (!bch2_err_matches(ret, BCH_ERR_transaction_restart))
break;
-next:
- while (bkey_ge(iter.pos, bch2_keylist_front(&op->insert_keys)->k.p)) {
- bch2_keylist_pop_front(&op->insert_keys);
- if (bch2_keylist_empty(&op->insert_keys))
- goto out;
- }
+
continue;
nowork:
if (m->stats) {
@@ -480,14 +473,17 @@ nowork:
atomic64_add(k.k->p.offset - iter.pos.offset,
&m->stats->sectors_raced);
}
-
count_event(c, io_move_fail);
- bch2_btree_iter_advance(trans, &iter);
- goto next;
+ bch2_btree_iter_advance(&iter);
+next:
+ while (bkey_ge(iter.pos, bch2_keylist_front(&op->insert_keys)->k.p)) {
+ bch2_keylist_pop_front(&op->insert_keys);
+ if (bch2_keylist_empty(&op->insert_keys))
+ goto out;
+ }
}
out:
- bch2_trans_iter_exit(trans, &iter);
BUG_ON(bch2_err_matches(ret, BCH_ERR_transaction_restart));
return ret;
}
@@ -553,10 +549,10 @@ int bch2_update_unwritten_extent(struct btree_trans *trans,
bch2_trans_iter_init(trans, &iter, update->btree_id, update->op.pos,
BTREE_ITER_slots);
ret = lockrestart_do(trans, ({
- k = bch2_btree_iter_peek_slot(trans, &iter);
+ k = bch2_btree_iter_peek_slot(&iter);
bkey_err(k);
}));
- bch2_trans_iter_exit(trans, &iter);
+ bch2_trans_iter_exit(&iter);
if (ret || !bch2_extents_match(k, bkey_i_to_s_c(update->k.k)))
break;
@@ -695,6 +691,15 @@ int bch2_extent_drop_ptrs(struct btree_trans *trans,
if (ret)
return ret;
+ const union bch_extent_entry *entry;
+ struct extent_ptr_decoded p;
+ unsigned i = 0;
+ bkey_for_each_ptr_decode(k.k, bch2_bkey_ptrs_c(k), p, entry) {
+ if (data_opts->kill_ec_ptrs & BIT(i))
+ bch2_bkey_drop_ec(n, p.ptr.dev);
+ i++;
+ }
+
while (data_opts->kill_ptrs) {
unsigned i = 0, drop = __fls(data_opts->kill_ptrs);