mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-03 09:04:21 +08:00
bcachefs: BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE
Add a new flag to control assertions about updating to internal snapshot nodes, that normally should not be written to - to be used in an upcoming patch. Also do some renaming - trigger_flags is now update_flags. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
This commit is contained in:
parent
d5bee8ca5a
commit
b00fde8fb1
@ -398,7 +398,9 @@ retry:
|
||||
* to be using alloc reserves:
|
||||
* */
|
||||
ret = bch2_btree_iter_traverse(b_iter) ?:
|
||||
bch2_trans_update(trans, b_iter, ck->k, BTREE_TRIGGER_NORUN) ?:
|
||||
bch2_trans_update(trans, b_iter, ck->k,
|
||||
BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE|
|
||||
BTREE_TRIGGER_NORUN) ?:
|
||||
bch2_trans_commit(trans, NULL, NULL,
|
||||
BTREE_INSERT_NOUNLOCK|
|
||||
BTREE_INSERT_NOCHECK_RW|
|
||||
|
@ -340,7 +340,7 @@ struct bkey_cached {
|
||||
};
|
||||
|
||||
struct btree_insert_entry {
|
||||
unsigned trigger_flags;
|
||||
unsigned flags;
|
||||
u8 bkey_type;
|
||||
enum btree_id btree_id:8;
|
||||
u8 level;
|
||||
@ -639,7 +639,9 @@ static inline bool btree_type_has_snapshots(enum btree_id id)
|
||||
return (1 << id) & BTREE_ID_HAS_SNAPSHOTS;
|
||||
}
|
||||
|
||||
enum btree_trigger_flags {
|
||||
enum btree_update_flags {
|
||||
__BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE,
|
||||
|
||||
__BTREE_TRIGGER_NORUN, /* Don't run triggers at all */
|
||||
|
||||
__BTREE_TRIGGER_INSERT,
|
||||
@ -650,6 +652,8 @@ enum btree_trigger_flags {
|
||||
__BTREE_TRIGGER_NOATOMIC,
|
||||
};
|
||||
|
||||
#define BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE (1U << __BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE)
|
||||
|
||||
#define BTREE_TRIGGER_NORUN (1U << __BTREE_TRIGGER_NORUN)
|
||||
|
||||
#define BTREE_TRIGGER_INSERT (1U << __BTREE_TRIGGER_INSERT)
|
||||
|
@ -77,7 +77,7 @@ int bch2_btree_node_update_key(struct bch_fs *, struct btree_iter *,
|
||||
struct btree *, struct bkey_i *);
|
||||
|
||||
int bch2_trans_update(struct btree_trans *, struct btree_iter *,
|
||||
struct bkey_i *, enum btree_trigger_flags);
|
||||
struct bkey_i *, enum btree_update_flags);
|
||||
void bch2_trans_commit_hook(struct btree_trans *,
|
||||
struct btree_trans_commit_hook *);
|
||||
int __bch2_trans_commit(struct btree_trans *);
|
||||
|
@ -363,7 +363,7 @@ static noinline void bch2_trans_mark_gc(struct btree_trans *trans)
|
||||
|
||||
if (gc_visited(c, gc_pos_btree_node(i->iter->l[0].b)))
|
||||
bch2_mark_update(trans, i->iter, i->k,
|
||||
i->trigger_flags|BTREE_TRIGGER_GC);
|
||||
i->flags|BTREE_TRIGGER_GC);
|
||||
}
|
||||
}
|
||||
|
||||
@ -468,7 +468,7 @@ bch2_trans_commit_write_locked(struct btree_trans *trans,
|
||||
trans_for_each_update(trans, i)
|
||||
if (BTREE_NODE_TYPE_HAS_MEM_TRIGGERS & (1U << i->bkey_type))
|
||||
bch2_mark_update(trans, i->iter, i->k,
|
||||
i->trigger_flags);
|
||||
i->flags);
|
||||
|
||||
if (marking && trans->fs_usage_deltas)
|
||||
bch2_trans_fs_usage_apply(trans, trans->fs_usage_deltas);
|
||||
@ -791,8 +791,7 @@ static noinline int extent_front_merge(struct btree_trans *trans,
|
||||
struct btree_iter *update_iter =
|
||||
bch2_trans_copy_iter(trans, iter);
|
||||
|
||||
ret = bch2_btree_delete_at(trans, update_iter,
|
||||
i->trigger_flags);
|
||||
ret = bch2_btree_delete_at(trans, update_iter, i->flags);
|
||||
bch2_trans_iter_put(trans, update_iter);
|
||||
|
||||
if (ret)
|
||||
@ -859,14 +858,16 @@ static int extent_handle_overwrites(struct btree_trans *trans,
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
bch2_trans_update(trans, update_iter, update, i->trigger_flags);
|
||||
bch2_trans_update(trans, update_iter, update,
|
||||
BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE|
|
||||
i->flags);
|
||||
bch2_trans_iter_put(trans, update_iter);
|
||||
}
|
||||
|
||||
if (bkey_cmp(k.k->p, i->k->k.p) <= 0) {
|
||||
update_iter = bch2_trans_copy_iter(trans, iter);
|
||||
ret = bch2_btree_delete_at(trans, update_iter,
|
||||
i->trigger_flags);
|
||||
i->flags);
|
||||
bch2_trans_iter_put(trans, update_iter);
|
||||
|
||||
if (ret)
|
||||
@ -881,7 +882,7 @@ static int extent_handle_overwrites(struct btree_trans *trans,
|
||||
bkey_reassemble(update, k);
|
||||
bch2_cut_front(i->k->k.p, update);
|
||||
|
||||
bch2_trans_update(trans, iter, update, i->trigger_flags);
|
||||
bch2_trans_update(trans, iter, update, i->flags);
|
||||
goto out;
|
||||
}
|
||||
next:
|
||||
@ -927,7 +928,7 @@ int __bch2_trans_commit(struct btree_trans *trans)
|
||||
#ifdef CONFIG_BCACHEFS_DEBUG
|
||||
trans_for_each_update(trans, i)
|
||||
if (btree_iter_type(i->iter) != BTREE_ITER_CACHED &&
|
||||
!(i->trigger_flags & BTREE_TRIGGER_NORUN))
|
||||
!(i->flags & BTREE_TRIGGER_NORUN))
|
||||
bch2_btree_key_cache_verify_clean(trans,
|
||||
i->btree_id, i->k->k.p);
|
||||
#endif
|
||||
@ -945,8 +946,8 @@ int __bch2_trans_commit(struct btree_trans *trans)
|
||||
i->trans_triggers_run = true;
|
||||
trans_trigger_run = true;
|
||||
|
||||
ret = bch2_trans_mark_update(trans, i->iter, i->k,
|
||||
i->trigger_flags);
|
||||
ret = bch2_trans_mark_update(trans, i->iter,
|
||||
i->k, i->flags);
|
||||
if (unlikely(ret)) {
|
||||
if (ret == -EINTR)
|
||||
trace_trans_restart_mark(trans->ip, _RET_IP_,
|
||||
@ -1029,10 +1030,10 @@ err:
|
||||
}
|
||||
|
||||
int bch2_trans_update(struct btree_trans *trans, struct btree_iter *iter,
|
||||
struct bkey_i *k, enum btree_trigger_flags flags)
|
||||
struct bkey_i *k, enum btree_update_flags flags)
|
||||
{
|
||||
struct btree_insert_entry *i, n = (struct btree_insert_entry) {
|
||||
.trigger_flags = flags,
|
||||
.flags = flags,
|
||||
.bkey_type = __btree_node_type(iter->level, iter->btree_id),
|
||||
.btree_id = iter->btree_id,
|
||||
.level = iter->level,
|
||||
@ -1130,7 +1131,7 @@ int bch2_btree_insert(struct bch_fs *c, enum btree_id id,
|
||||
}
|
||||
|
||||
int bch2_btree_delete_at(struct btree_trans *trans,
|
||||
struct btree_iter *iter, unsigned trigger_flags)
|
||||
struct btree_iter *iter, unsigned update_flags)
|
||||
{
|
||||
struct bkey_i *k;
|
||||
|
||||
@ -1140,7 +1141,7 @@ int bch2_btree_delete_at(struct btree_trans *trans,
|
||||
|
||||
bkey_init(&k->k);
|
||||
k->k.p = iter->pos;
|
||||
return bch2_trans_update(trans, iter, k, trigger_flags);
|
||||
return bch2_trans_update(trans, iter, k, update_flags);
|
||||
}
|
||||
|
||||
int bch2_btree_delete_range_trans(struct btree_trans *trans, enum btree_id id,
|
||||
|
Loading…
Reference in New Issue
Block a user