diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2024-12-28 21:04:36 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2025-01-19 20:36:02 -0500 |
commit | 2c9ed98278d6d805e3351389a9811e6c5e402dd0 (patch) | |
tree | 350e45880864cfb714d4af45f4ff24e0a3115635 | |
parent | 22e158ca2f2bbcf021641c41a6540fcae2a24391 (diff) |
bcachefs: __bch2_move_data_phys() now uses bch2_btree_node_rewrite_key()
Kill most of the separate logic for btree nodes.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/move.c | 107 |
1 files changed, 37 insertions, 70 deletions
diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c index 93e33651f4b5..dd7b70c7ee7d 100644 --- a/fs/bcachefs/move.c +++ b/fs/bcachefs/move.c @@ -737,91 +737,58 @@ static int __bch2_move_data_phys(struct moving_context *ctxt, struct bkey_s_c_backpointer bp = bkey_s_c_to_backpointer(k); if (ctxt->stats) - ctxt->stats->offset = - bp.k->p.offset >> MAX_EXTENT_COMPRESS_RATIO_SHIFT; + ctxt->stats->offset = bp.k->p.offset >> MAX_EXTENT_COMPRESS_RATIO_SHIFT; - if (!bp.v->level) { - k = bch2_backpointer_get_key(trans, bp, &iter, 0, &last_flushed); - ret = bkey_err(k); - if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) - continue; - if (ret) - goto err; - if (!k.k) - goto next; + k = bch2_backpointer_get_key(trans, bp, &iter, 0, &last_flushed); + ret = bkey_err(k); + if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) + continue; + if (ret) + goto err; + if (!k.k) + goto next; + if (!bp.v->level) { ret = bch2_move_get_io_opts_one(trans, &io_opts, &iter, k); if (ret) { bch2_trans_iter_exit(trans, &iter); continue; } + } - struct data_update_opts data_opts = {}; - if (!pred(c, arg, k, &io_opts, &data_opts)) { - bch2_trans_iter_exit(trans, &iter); - goto next; - } - - bch2_bkey_buf_reassemble(&sk, c, k); - k = bkey_i_to_s_c(sk.k); - - unsigned sectors = bp.v->bucket_len; /* move_extent will drop locks */ - - ret = bch2_move_extent(ctxt, bucket_in_flight, - &iter, k, io_opts, data_opts); + struct data_update_opts data_opts = {}; + if (!pred(c, arg, k, &io_opts, &data_opts)) { bch2_trans_iter_exit(trans, &iter); + goto next; + } - if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) - continue; - if (ret == -ENOMEM) { - /* memory allocation failure, wait for some IO to finish */ - bch2_move_ctxt_wait_for_io(ctxt); - continue; - } - if (ret) - goto err; - - if (ctxt->stats) - atomic64_add(sectors, &ctxt->stats->sectors_seen); - sectors_moved += sectors; - } else { - struct btree *b; - - b = bch2_backpointer_get_node(trans, bp, &iter, &last_flushed); - ret = PTR_ERR_OR_ZERO(b); - if (ret == -BCH_ERR_backpointer_to_overwritten_btree_node) - goto next; - if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) - continue; - if (ret) - goto err; - if (!b) - goto next; - - struct data_update_opts data_opts = {}; - if (!pred(c, arg, bkey_i_to_s_c(&b->key), &io_opts, &data_opts)) { - bch2_trans_iter_exit(trans, &iter); - goto next; - } + bch2_bkey_buf_reassemble(&sk, c, k); + k = bkey_i_to_s_c(sk.k); - unsigned sectors = btree_ptr_sectors_written(bkey_i_to_s_c(&b->key)); + /* move_extent will drop locks */ + unsigned sectors = !bp.v->level + ? bp.v->bucket_len + : btree_ptr_sectors_written(k); - ret = bch2_btree_node_rewrite(trans, &iter, b, 0); - bch2_trans_iter_exit(trans, &iter); + ret = !bp.v->level + ? bch2_move_extent(ctxt, bucket_in_flight, &iter, k, io_opts, data_opts) + : bch2_btree_node_rewrite_key(trans, bp.v->btree_id, bp.v->level, k.k->p, 0); - if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) - continue; - if (ret) - goto err; + bch2_trans_iter_exit(trans, &iter); - if (ctxt->rate) - bch2_ratelimit_increment(ctxt->rate, sectors); - if (ctxt->stats) { - atomic64_add(sectors, &ctxt->stats->sectors_seen); - atomic64_add(sectors, &ctxt->stats->sectors_moved); - } - sectors_moved += sectors; + if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) + continue; + if (ret == -ENOMEM) { + /* memory allocation failure, wait for some IO to finish */ + bch2_move_ctxt_wait_for_io(ctxt); + continue; } + if (ret) + goto err; + + if (ctxt->stats) + atomic64_add(sectors, &ctxt->stats->sectors_seen); + sectors_moved += sectors; next: bch2_btree_iter_advance(&bp_iter); } |