Skip to content

Commit 9ab55df

Browse files
author
Kent Overstreet
committed
bcachefs: Walk leaf to root in btree_gc
Next change will move gc_alloc_start initialization into the alloc trigger, so we have to mark those first. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
1 parent 86d4647 commit 9ab55df

File tree

2 files changed

+24
-25
lines changed

2 files changed

+24
-25
lines changed

fs/bcachefs/btree_gc.c

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -635,13 +635,27 @@ static int bch2_gc_mark_key(struct btree_trans *trans, enum btree_id btree_id,
635635
static int bch2_gc_btree(struct btree_trans *trans, enum btree_id btree, bool initial)
636636
{
637637
struct bch_fs *c = trans->c;
638-
int level = 0, target_depth = btree_node_type_needs_gc(__btree_node_type(0, btree)) ? 0 : 1;
638+
unsigned target_depth = btree_node_type_needs_gc(__btree_node_type(0, btree)) ? 0 : 1;
639639
int ret = 0;
640640

641641
/* We need to make sure every leaf node is readable before going RW */
642642
if (initial)
643643
target_depth = 0;
644644

645+
for (unsigned level = target_depth; level < BTREE_MAX_DEPTH; level++) {
646+
struct btree *prev = NULL;
647+
struct btree_iter iter;
648+
bch2_trans_node_iter_init(trans, &iter, btree, POS_MIN, 0, level,
649+
BTREE_ITER_prefetch);
650+
651+
ret = for_each_btree_key_continue(trans, iter, 0, k, ({
652+
gc_pos_set(c, gc_pos_btree(btree, level, k.k->p));
653+
bch2_gc_mark_key(trans, btree, level, &prev, &iter, k, initial);
654+
}));
655+
if (ret)
656+
goto err;
657+
}
658+
645659
/* root */
646660
do {
647661
retry_root:
@@ -663,28 +677,11 @@ static int bch2_gc_btree(struct btree_trans *trans, enum btree_id btree, bool in
663677
gc_pos_set(c, gc_pos_btree(btree, b->c.level + 1, SPOS_MAX));
664678
struct bkey_s_c k = bkey_i_to_s_c(&b->key);
665679
ret = bch2_gc_mark_key(trans, btree, b->c.level + 1, NULL, NULL, k, initial);
666-
level = b->c.level;
667680
err_root:
668681
bch2_trans_iter_exit(trans, &iter);
669682
} while (bch2_err_matches(ret, BCH_ERR_transaction_restart));
670-
671-
if (ret)
672-
return ret;
673-
674-
for (; level >= target_depth; --level) {
675-
struct btree *prev = NULL;
676-
struct btree_iter iter;
677-
bch2_trans_node_iter_init(trans, &iter, btree, POS_MIN, 0, level,
678-
BTREE_ITER_prefetch);
679-
680-
ret = for_each_btree_key_continue(trans, iter, 0, k, ({
681-
gc_pos_set(c, gc_pos_btree(btree, level, k.k->p));
682-
bch2_gc_mark_key(trans, btree, level, &prev, &iter, k, initial);
683-
}));
684-
if (ret)
685-
break;
686-
}
687-
683+
err:
684+
bch_err_fn(c, ret);
688685
return ret;
689686
}
690687

fs/bcachefs/btree_gc.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,20 @@ static inline struct gc_pos gc_pos_btree_node(struct btree *b)
5858

5959
static inline int gc_btree_order(enum btree_id btree)
6060
{
61+
if (btree == BTREE_ID_alloc)
62+
return -2;
6163
if (btree == BTREE_ID_stripes)
6264
return -1;
6365
return btree;
6466
}
6567

6668
static inline int gc_pos_cmp(struct gc_pos l, struct gc_pos r)
6769
{
68-
return cmp_int(l.phase, r.phase) ?:
69-
cmp_int(gc_btree_order(l.btree),
70-
gc_btree_order(r.btree)) ?:
71-
-cmp_int(l.level, r.level) ?:
72-
bpos_cmp(l.pos, r.pos);
70+
return cmp_int(l.phase, r.phase) ?:
71+
cmp_int(gc_btree_order(l.btree),
72+
gc_btree_order(r.btree)) ?:
73+
cmp_int(l.level, r.level) ?:
74+
bpos_cmp(l.pos, r.pos);
7375
}
7476

7577
static inline bool gc_visited(struct bch_fs *c, struct gc_pos pos)

0 commit comments

Comments
 (0)