diff options
Diffstat (limited to 'libbcachefs/btree_gc.c')
-rw-r--r-- | libbcachefs/btree_gc.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/libbcachefs/btree_gc.c b/libbcachefs/btree_gc.c index f4adb07a..8b114d4f 100644 --- a/libbcachefs/btree_gc.c +++ b/libbcachefs/btree_gc.c @@ -216,7 +216,7 @@ static int bch2_gc_btree(struct bch_fs *c, enum btree_id btree_id, : expensive_debug_checks(c) ? 0 : !btree_node_type_needs_gc(btree_id) ? 1 : 0; - u8 max_stale; + u8 max_stale = 0; int ret = 0; bch2_trans_init(&trans, c, 0, 0); @@ -640,12 +640,7 @@ static int bch2_gc_start(struct bch_fs *c, { struct bch_dev *ca; unsigned i; - - /* - * indicate to stripe code that we need to allocate for the gc stripes - * radix tree, too - */ - gc_pos_set(c, gc_phase(GC_PHASE_START)); + int ret; BUG_ON(c->usage_gc); @@ -673,6 +668,18 @@ static int bch2_gc_start(struct bch_fs *c, } } + ret = bch2_ec_mem_alloc(c, true); + if (ret) + return ret; + + percpu_down_write(&c->mark_lock); + + /* + * indicate to stripe code that we need to allocate for the gc stripes + * radix tree, too + */ + gc_pos_set(c, gc_phase(GC_PHASE_START)); + for_each_member_device(ca, c, i) { struct bucket_array *dst = __bucket_array(ca, 1); struct bucket_array *src = __bucket_array(ca, 0); @@ -697,7 +704,9 @@ static int bch2_gc_start(struct bch_fs *c, } }; - return bch2_ec_mem_alloc(c, true); + percpu_up_write(&c->mark_lock); + + return 0; } /** @@ -730,10 +739,7 @@ int bch2_gc(struct bch_fs *c, struct journal_keys *journal_keys, down_write(&c->gc_lock); again: - percpu_down_write(&c->mark_lock); ret = bch2_gc_start(c, metadata_only); - percpu_up_write(&c->mark_lock); - if (ret) goto out; |