diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-02-26 21:36:39 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-02-27 21:36:36 -0500 |
commit | 30cca2e94d0dfa8c3151daf1393f402d32bb9407 (patch) | |
tree | cbf1b7ccfdcaace597389147c27031c0e8106f12 /libbcachefs/alloc_background.c | |
parent | bf359ac1ad97929e1023632aafb272d655504516 (diff) |
Update bcachefs sources to ca97ee3577 bcachefs: bch2_btree_iter_peek_and_restart_outlined()
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'libbcachefs/alloc_background.c')
-rw-r--r-- | libbcachefs/alloc_background.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/libbcachefs/alloc_background.c b/libbcachefs/alloc_background.c index b39a4533..5f4bb82c 100644 --- a/libbcachefs/alloc_background.c +++ b/libbcachefs/alloc_background.c @@ -2175,21 +2175,24 @@ void bch2_dev_allocator_remove(struct bch_fs *c, struct bch_dev *ca) } mutex_unlock(&c->btree_reserve_cache_lock); - while (1) { - struct open_bucket *ob; - - spin_lock(&c->freelist_lock); - if (!ca->open_buckets_partial_nr) { + spin_lock(&c->freelist_lock); + i = 0; + while (i < c->open_buckets_partial_nr) { + struct open_bucket *ob = + c->open_buckets + c->open_buckets_partial[i]; + + if (ob->dev == ca->dev_idx) { + swap(c->open_buckets_partial[i], + c->open_buckets_partial[--c->open_buckets_partial_nr]); + ob->on_partial_list = false; spin_unlock(&c->freelist_lock); - break; + bch2_open_bucket_put(c, ob); + spin_lock(&c->freelist_lock); + } else { + i++; } - ob = c->open_buckets + - ca->open_buckets_partial[--ca->open_buckets_partial_nr]; - ob->on_partial_list = false; - spin_unlock(&c->freelist_lock); - - bch2_open_bucket_put(c, ob); } + spin_unlock(&c->freelist_lock); bch2_ec_stop_dev(c, ca); |