mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
bcachefs: rework bch2_trans_commit_run_triggers()
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
c7c07bf250
commit
65bc7688b8
|
|
@ -336,6 +336,7 @@ static inline void btree_insert_entry_checks(struct btree_trans *trans,
|
||||||
BUG_ON(i->cached != path->cached);
|
BUG_ON(i->cached != path->cached);
|
||||||
BUG_ON(i->level != path->level);
|
BUG_ON(i->level != path->level);
|
||||||
BUG_ON(i->btree_id != path->btree_id);
|
BUG_ON(i->btree_id != path->btree_id);
|
||||||
|
BUG_ON(i->bkey_type != __btree_node_type(path->level, path->btree_id));
|
||||||
EBUG_ON(!i->level &&
|
EBUG_ON(!i->level &&
|
||||||
btree_type_has_snapshots(i->btree_id) &&
|
btree_type_has_snapshots(i->btree_id) &&
|
||||||
!(i->flags & BTREE_UPDATE_internal_snapshot_node) &&
|
!(i->flags & BTREE_UPDATE_internal_snapshot_node) &&
|
||||||
|
|
@ -517,69 +518,45 @@ static int run_one_trans_trigger(struct btree_trans *trans, struct btree_insert_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int run_btree_triggers(struct btree_trans *trans, enum btree_id btree_id,
|
|
||||||
unsigned *btree_id_updates_start)
|
|
||||||
{
|
|
||||||
bool trans_trigger_run;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Running triggers will append more updates to the list of updates as
|
|
||||||
* we're walking it:
|
|
||||||
*/
|
|
||||||
do {
|
|
||||||
trans_trigger_run = false;
|
|
||||||
|
|
||||||
for (unsigned i = *btree_id_updates_start;
|
|
||||||
i < trans->nr_updates && trans->updates[i].btree_id <= btree_id;
|
|
||||||
i++) {
|
|
||||||
if (trans->updates[i].btree_id < btree_id) {
|
|
||||||
*btree_id_updates_start = i;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ret = run_one_trans_trigger(trans, trans->updates + i);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
if (ret)
|
|
||||||
trans_trigger_run = true;
|
|
||||||
}
|
|
||||||
} while (trans_trigger_run);
|
|
||||||
|
|
||||||
trans_for_each_update(trans, i)
|
|
||||||
BUG_ON(!(i->flags & BTREE_TRIGGER_norun) &&
|
|
||||||
i->btree_id == btree_id &&
|
|
||||||
btree_node_type_has_trans_triggers(i->bkey_type) &&
|
|
||||||
(!i->insert_trigger_run || !i->overwrite_trigger_run));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int bch2_trans_commit_run_triggers(struct btree_trans *trans)
|
static int bch2_trans_commit_run_triggers(struct btree_trans *trans)
|
||||||
{
|
{
|
||||||
unsigned btree_id = 0, btree_id_updates_start = 0;
|
unsigned sort_id_start = 0;
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
/*
|
while (sort_id_start < trans->nr_updates) {
|
||||||
*
|
unsigned i, sort_id = trans->updates[sort_id_start].sort_order;
|
||||||
* For a given btree, this algorithm runs insert triggers before
|
bool trans_trigger_run;
|
||||||
* overwrite triggers: this is so that when extents are being moved
|
|
||||||
* (e.g. by FALLOCATE_FL_INSERT_RANGE), we don't drop references before
|
|
||||||
* they are re-added.
|
|
||||||
*/
|
|
||||||
for (btree_id = 0; btree_id < BTREE_ID_NR; btree_id++) {
|
|
||||||
if (btree_id == BTREE_ID_alloc)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ret = run_btree_triggers(trans, btree_id, &btree_id_updates_start);
|
/*
|
||||||
if (ret)
|
* For a given btree, this algorithm runs insert triggers before
|
||||||
return ret;
|
* overwrite triggers: this is so that when extents are being
|
||||||
|
* moved (e.g. by FALLOCATE_FL_INSERT_RANGE), we don't drop
|
||||||
|
* references before they are re-added.
|
||||||
|
*
|
||||||
|
* Running triggers will append more updates to the list of
|
||||||
|
* updates as we're walking it:
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
trans_trigger_run = false;
|
||||||
|
|
||||||
|
for (i = sort_id_start;
|
||||||
|
i < trans->nr_updates && trans->updates[i].sort_order <= sort_id;
|
||||||
|
i++) {
|
||||||
|
if (trans->updates[i].sort_order < sort_id) {
|
||||||
|
sort_id_start = i;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ret = run_one_trans_trigger(trans, trans->updates + i);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
if (ret)
|
||||||
|
trans_trigger_run = true;
|
||||||
|
}
|
||||||
|
} while (trans_trigger_run);
|
||||||
|
|
||||||
|
sort_id_start = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
btree_id_updates_start = 0;
|
|
||||||
ret = run_btree_triggers(trans, BTREE_ID_alloc, &btree_id_updates_start);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
#ifdef CONFIG_BCACHEFS_DEBUG
|
#ifdef CONFIG_BCACHEFS_DEBUG
|
||||||
trans_for_each_update(trans, i)
|
trans_for_each_update(trans, i)
|
||||||
BUG_ON(!(i->flags & BTREE_TRIGGER_norun) &&
|
BUG_ON(!(i->flags & BTREE_TRIGGER_norun) &&
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
static inline int btree_insert_entry_cmp(const struct btree_insert_entry *l,
|
static inline int btree_insert_entry_cmp(const struct btree_insert_entry *l,
|
||||||
const struct btree_insert_entry *r)
|
const struct btree_insert_entry *r)
|
||||||
{
|
{
|
||||||
return cmp_int(l->btree_id, r->btree_id) ?:
|
return cmp_int(l->sort_order, r->sort_order) ?:
|
||||||
cmp_int(l->cached, r->cached) ?:
|
cmp_int(l->cached, r->cached) ?:
|
||||||
-cmp_int(l->level, r->level) ?:
|
-cmp_int(l->level, r->level) ?:
|
||||||
bpos_cmp(l->k->k.p, r->k->k.p);
|
bpos_cmp(l->k->k.p, r->k->k.p);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user