Loading fs/bcachefs/snapshot.c +0 −97 Original line number Diff line number Diff line Loading @@ -1732,103 +1732,6 @@ int __bch2_key_has_snapshot_overwrites(struct btree_trans *trans, return ret; } static u32 bch2_snapshot_smallest_child(struct bch_fs *c, u32 id) { const struct snapshot_t *s = snapshot_t(c, id); return s->children[1] ?: s->children[0]; } static u32 bch2_snapshot_smallest_descendent(struct bch_fs *c, u32 id) { u32 child; while ((child = bch2_snapshot_smallest_child(c, id))) id = child; return id; } static int bch2_propagate_key_to_snapshot_leaf(struct btree_trans *trans, enum btree_id btree, struct bkey_s_c interior_k, u32 leaf_id, struct bpos *new_min_pos) { struct btree_iter iter; struct bpos pos = interior_k.k->p; struct bkey_s_c k; struct bkey_i *new; int ret; pos.snapshot = leaf_id; bch2_trans_iter_init(trans, &iter, btree, pos, BTREE_ITER_intent); k = bch2_btree_iter_peek_slot(&iter); ret = bkey_err(k); if (ret) goto out; /* key already overwritten in this snapshot? */ if (k.k->p.snapshot != interior_k.k->p.snapshot) goto out; if (bpos_eq(*new_min_pos, POS_MIN)) { *new_min_pos = k.k->p; new_min_pos->snapshot = leaf_id; } new = bch2_bkey_make_mut_noupdate(trans, interior_k); ret = PTR_ERR_OR_ZERO(new); if (ret) goto out; new->k.p.snapshot = leaf_id; ret = bch2_trans_update(trans, &iter, new, 0); out: bch2_set_btree_iter_dontneed(&iter); bch2_trans_iter_exit(trans, &iter); return ret; } int bch2_propagate_key_to_snapshot_leaves(struct btree_trans *trans, enum btree_id btree, struct bkey_s_c k, struct bpos *new_min_pos) { struct bch_fs *c = trans->c; struct bkey_buf sk; u32 restart_count = trans->restart_count; int ret = 0; bch2_bkey_buf_init(&sk); bch2_bkey_buf_reassemble(&sk, c, k); k = bkey_i_to_s_c(sk.k); *new_min_pos = POS_MIN; for (u32 id = bch2_snapshot_smallest_descendent(c, k.k->p.snapshot); id < k.k->p.snapshot; id++) { if (!bch2_snapshot_is_ancestor(c, id, k.k->p.snapshot) || !bch2_snapshot_is_leaf(c, id)) continue; again: ret = btree_trans_too_many_iters(trans) ?: bch2_propagate_key_to_snapshot_leaf(trans, btree, k, id, new_min_pos) ?: bch2_trans_commit(trans, NULL, NULL, 0); if (ret && bch2_err_matches(ret, BCH_ERR_transaction_restart)) { bch2_trans_begin(trans); goto again; } if (ret) break; } bch2_bkey_buf_exit(&sk, c); return ret ?: trans_was_restarted(trans, restart_count); } static int bch2_check_snapshot_needs_deletion(struct btree_trans *trans, struct bkey_s_c k) { struct bch_fs *c = trans->c; Loading fs/bcachefs/snapshot.h +0 −3 Original line number Diff line number Diff line Loading @@ -259,9 +259,6 @@ static inline int bch2_key_has_snapshot_overwrites(struct btree_trans *trans, return __bch2_key_has_snapshot_overwrites(trans, id, pos); } int bch2_propagate_key_to_snapshot_leaves(struct btree_trans *, enum btree_id, struct bkey_s_c, struct bpos *); int bch2_snapshots_read(struct bch_fs *); void bch2_fs_snapshots_exit(struct bch_fs *); Loading Loading
fs/bcachefs/snapshot.c +0 −97 Original line number Diff line number Diff line Loading @@ -1732,103 +1732,6 @@ int __bch2_key_has_snapshot_overwrites(struct btree_trans *trans, return ret; } static u32 bch2_snapshot_smallest_child(struct bch_fs *c, u32 id) { const struct snapshot_t *s = snapshot_t(c, id); return s->children[1] ?: s->children[0]; } static u32 bch2_snapshot_smallest_descendent(struct bch_fs *c, u32 id) { u32 child; while ((child = bch2_snapshot_smallest_child(c, id))) id = child; return id; } static int bch2_propagate_key_to_snapshot_leaf(struct btree_trans *trans, enum btree_id btree, struct bkey_s_c interior_k, u32 leaf_id, struct bpos *new_min_pos) { struct btree_iter iter; struct bpos pos = interior_k.k->p; struct bkey_s_c k; struct bkey_i *new; int ret; pos.snapshot = leaf_id; bch2_trans_iter_init(trans, &iter, btree, pos, BTREE_ITER_intent); k = bch2_btree_iter_peek_slot(&iter); ret = bkey_err(k); if (ret) goto out; /* key already overwritten in this snapshot? */ if (k.k->p.snapshot != interior_k.k->p.snapshot) goto out; if (bpos_eq(*new_min_pos, POS_MIN)) { *new_min_pos = k.k->p; new_min_pos->snapshot = leaf_id; } new = bch2_bkey_make_mut_noupdate(trans, interior_k); ret = PTR_ERR_OR_ZERO(new); if (ret) goto out; new->k.p.snapshot = leaf_id; ret = bch2_trans_update(trans, &iter, new, 0); out: bch2_set_btree_iter_dontneed(&iter); bch2_trans_iter_exit(trans, &iter); return ret; } int bch2_propagate_key_to_snapshot_leaves(struct btree_trans *trans, enum btree_id btree, struct bkey_s_c k, struct bpos *new_min_pos) { struct bch_fs *c = trans->c; struct bkey_buf sk; u32 restart_count = trans->restart_count; int ret = 0; bch2_bkey_buf_init(&sk); bch2_bkey_buf_reassemble(&sk, c, k); k = bkey_i_to_s_c(sk.k); *new_min_pos = POS_MIN; for (u32 id = bch2_snapshot_smallest_descendent(c, k.k->p.snapshot); id < k.k->p.snapshot; id++) { if (!bch2_snapshot_is_ancestor(c, id, k.k->p.snapshot) || !bch2_snapshot_is_leaf(c, id)) continue; again: ret = btree_trans_too_many_iters(trans) ?: bch2_propagate_key_to_snapshot_leaf(trans, btree, k, id, new_min_pos) ?: bch2_trans_commit(trans, NULL, NULL, 0); if (ret && bch2_err_matches(ret, BCH_ERR_transaction_restart)) { bch2_trans_begin(trans); goto again; } if (ret) break; } bch2_bkey_buf_exit(&sk, c); return ret ?: trans_was_restarted(trans, restart_count); } static int bch2_check_snapshot_needs_deletion(struct btree_trans *trans, struct bkey_s_c k) { struct bch_fs *c = trans->c; Loading
fs/bcachefs/snapshot.h +0 −3 Original line number Diff line number Diff line Loading @@ -259,9 +259,6 @@ static inline int bch2_key_has_snapshot_overwrites(struct btree_trans *trans, return __bch2_key_has_snapshot_overwrites(trans, id, pos); } int bch2_propagate_key_to_snapshot_leaves(struct btree_trans *, enum btree_id, struct bkey_s_c, struct bpos *); int bch2_snapshots_read(struct bch_fs *); void bch2_fs_snapshots_exit(struct bch_fs *); Loading