diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-02-25 08:32:34 +0300 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-23 00:09:54 +0300 |
commit | 39a1ea129a6906a0d6127036222bdb68ec01a277 (patch) | |
tree | 1dcdfd588d9e236433d3bf5b1c87903de2af2d8f /fs/bcachefs/alloc_foreground.c | |
parent | 0d763863af0b1d70dcb64e515df4b9242bc9c28d (diff) | |
download | linux-39a1ea129a6906a0d6127036222bdb68ec01a277.tar.xz |
bcachefs: Single open_bucket_partial list
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/alloc_foreground.c')
-rw-r--r-- | fs/bcachefs/alloc_foreground.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/fs/bcachefs/alloc_foreground.c b/fs/bcachefs/alloc_foreground.c index 0b0fe4fea6cc..1405d6b8cbc5 100644 --- a/fs/bcachefs/alloc_foreground.c +++ b/fs/bcachefs/alloc_foreground.c @@ -154,18 +154,15 @@ static void open_bucket_free_unused(struct bch_fs *c, struct write_point *wp, struct open_bucket *ob) { - struct bch_dev *ca = bch_dev_bkey_exists(c, ob->dev); bool may_realloc = wp->data_type == BCH_DATA_user; - BUG_ON(ca->open_buckets_partial_nr > - ARRAY_SIZE(ca->open_buckets_partial)); + BUG_ON(c->open_buckets_partial_nr >= + ARRAY_SIZE(c->open_buckets_partial)); - if (ca->open_buckets_partial_nr < - ARRAY_SIZE(ca->open_buckets_partial) && - may_realloc) { + if (may_realloc) { spin_lock(&c->freelist_lock); ob->on_partial_list = true; - ca->open_buckets_partial[ca->open_buckets_partial_nr++] = + c->open_buckets_partial[c->open_buckets_partial_nr++] = ob - c->open_buckets; spin_unlock(&c->freelist_lock); @@ -394,12 +391,13 @@ static struct open_bucket *try_alloc_partial_bucket(struct bch_fs *c, struct bch spin_lock(&c->freelist_lock); - for (i = ca->open_buckets_partial_nr - 1; i >= 0; --i) { - ob = c->open_buckets + ca->open_buckets_partial[i]; + for (i = c->open_buckets_partial_nr - 1; i >= 0; --i) { + ob = c->open_buckets + c->open_buckets_partial[i]; - if (reserve <= ob->alloc_reserve) { - array_remove_item(ca->open_buckets_partial, - ca->open_buckets_partial_nr, + if (ob->dev == ca->dev_idx && + reserve <= ob->alloc_reserve) { + array_remove_item(c->open_buckets_partial, + c->open_buckets_partial_nr, i); ob->on_partial_list = false; ob->alloc_reserve = reserve; |