- while (idx < end_idx && !ret)
- ret = __bch2_mark_reflink_p(c, p, &idx, flags, l++);
-
- return ret;
-}
-
-static int bch2_mark_key_locked(struct bch_fs *c,
- struct bkey_s_c old,
- struct bkey_s_c new,
- u64 journal_seq, unsigned flags)
-{
- struct bkey_s_c k = flags & BTREE_TRIGGER_INSERT ? new : old;
-
- BUG_ON(!(flags & (BTREE_TRIGGER_INSERT|BTREE_TRIGGER_OVERWRITE)));
-
- switch (k.k->type) {
- case KEY_TYPE_alloc:
- case KEY_TYPE_alloc_v2:
- return bch2_mark_alloc(c, old, new, journal_seq, flags);
- case KEY_TYPE_btree_ptr:
- case KEY_TYPE_btree_ptr_v2:
- case KEY_TYPE_extent:
- case KEY_TYPE_reflink_v:
- return bch2_mark_extent(c, old, new, journal_seq, flags);
- case KEY_TYPE_stripe:
- return bch2_mark_stripe(c, old, new, journal_seq, flags);
- case KEY_TYPE_inode:
- return bch2_mark_inode(c, old, new, journal_seq, flags);
- case KEY_TYPE_reservation:
- return bch2_mark_reservation(c, old, new, journal_seq, flags);
- case KEY_TYPE_reflink_p:
- return bch2_mark_reflink_p(c, old, new, journal_seq, flags);
- case KEY_TYPE_snapshot:
- return bch2_mark_snapshot(c, old, new, journal_seq, flags);
- default:
- return 0;
- }
-}
-
-int bch2_mark_key(struct bch_fs *c, struct bkey_s_c new, unsigned flags)
-{
- struct bkey deleted = KEY(0, 0, 0);
- struct bkey_s_c old = (struct bkey_s_c) { &deleted, NULL };
- int ret;
-
- percpu_down_read(&c->mark_lock);
- ret = bch2_mark_key_locked(c, old, new, 0, flags);
- percpu_up_read(&c->mark_lock);
-
- return ret;
-}
-
-int bch2_mark_update(struct btree_trans *trans, struct btree_path *path,
- struct bkey_i *new, unsigned flags)
-{
- struct bch_fs *c = trans->c;
- struct bkey _deleted = KEY(0, 0, 0);
- struct bkey_s_c deleted = (struct bkey_s_c) { &_deleted, NULL };
- struct bkey_s_c old;
- struct bkey unpacked;
- int ret;
-
- if (unlikely(flags & BTREE_TRIGGER_NORUN))
- return 0;
-
- if (!btree_node_type_needs_gc(path->btree_id))
- return 0;
-
- old = bch2_btree_path_peek_slot(path, &unpacked);
-
- if (old.k->type == new->k.type &&
- ((1U << old.k->type) & BTREE_TRIGGER_WANTS_OLD_AND_NEW)) {
- ret = bch2_mark_key_locked(c, old, bkey_i_to_s_c(new),
- trans->journal_res.seq,
- BTREE_TRIGGER_INSERT|BTREE_TRIGGER_OVERWRITE|flags);
- } else {
- ret = bch2_mark_key_locked(c, deleted, bkey_i_to_s_c(new),
- trans->journal_res.seq,
- BTREE_TRIGGER_INSERT|flags) ?:
- bch2_mark_key_locked(c, old, deleted,
- trans->journal_res.seq,
- BTREE_TRIGGER_OVERWRITE|flags);
- }