diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-12-20 23:08:41 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-12-23 23:40:46 -0500 |
commit | 1b4fba9837e14617ca187963135ebdea742fcce4 (patch) | |
tree | a41d43bdec6cafc8d9c6a63ff8cb5c42fc115144 | |
parent | b71ae58d2b93d0e4f6a365ec9f771d3870510fd1 (diff) |
bcachefs: bch2_alloc_sectors_trans()
New helper, to be used for delayed allocation of btree nodes.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/alloc_foreground.c | 45 | ||||
-rw-r--r-- | fs/bcachefs/alloc_foreground.h | 9 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_interior.c | 28 |
3 files changed, 59 insertions, 23 deletions
diff --git a/fs/bcachefs/alloc_foreground.c b/fs/bcachefs/alloc_foreground.c index cbd3032d520f..a1bfa9eaee42 100644 --- a/fs/bcachefs/alloc_foreground.c +++ b/fs/bcachefs/alloc_foreground.c @@ -1443,6 +1443,51 @@ err: return ret; } +int bch2_alloc_sectors_trans(struct btree_trans *trans, + unsigned target, + unsigned erasure_code, + struct write_point_specifier write_point, + unsigned nr_replicas, + unsigned nr_replicas_required, + enum bch_watermark watermark, + unsigned flags, + unsigned sectors, + struct closure *cl, + struct open_buckets *obs, + struct bkey_i *k) +{ + struct bch_fs *c = trans->c; +retry: + struct bch_devs_list devs_have = (struct bch_devs_list) { 0 }; + struct write_point *wp; + int ret = bch2_alloc_sectors_start_trans(trans, + target, erasure_code, write_point, + &devs_have, + nr_replicas, + nr_replicas_required, + watermark, 0, cl, &wp); + if (unlikely(ret)) + return ret; + + if (wp->sectors_free < sectors) { + struct open_bucket *ob; + unsigned i; + + open_bucket_for_each(c, &wp->ptrs, ob, i) + if (ob->sectors_free < sectors) + ob->sectors_free = 0; + + bch2_alloc_sectors_done(c, wp); + goto retry; + } + + bch2_alloc_sectors_append_ptrs(c, wp, k, sectors, false); + + bch2_open_bucket_get(c, wp, obs); + bch2_alloc_sectors_done(c, wp); + return 0; +} + struct bch_extent_ptr bch2_ob_ptr(struct bch_fs *c, struct open_bucket *ob) { struct bch_dev *ca = bch_dev_bkey_exists(c, ob->dev); diff --git a/fs/bcachefs/alloc_foreground.h b/fs/bcachefs/alloc_foreground.h index 7aaeec44c746..86b840343b59 100644 --- a/fs/bcachefs/alloc_foreground.h +++ b/fs/bcachefs/alloc_foreground.h @@ -164,6 +164,15 @@ int bch2_alloc_sectors_start_trans(struct btree_trans *, unsigned, struct closure *, struct write_point **); +int bch2_alloc_sectors_trans(struct btree_trans *, + unsigned, unsigned, + struct write_point_specifier, + unsigned, unsigned, + enum bch_watermark, + unsigned, unsigned, + struct closure *, + struct open_buckets *, + struct bkey_i *); struct bch_extent_ptr bch2_ob_ptr(struct bch_fs *, struct open_bucket *); diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c index 55a3a67359b2..de796dfb3df8 100644 --- a/fs/bcachefs/btree_update_interior.c +++ b/fs/bcachefs/btree_update_interior.c @@ -249,11 +249,9 @@ static struct btree *__bch2_btree_node_alloc(struct btree_trans *trans, unsigned flags) { struct bch_fs *c = trans->c; - struct write_point *wp; struct btree *b; BKEY_PADDED_ONSTACK(k, BKEY_BTREE_PTR_VAL_U64s_MAX) tmp; struct open_buckets obs = { .nr = 0 }; - struct bch_devs_list devs_have = (struct bch_devs_list) { 0 }; enum bch_watermark watermark = flags & BCH_WATERMARK_MASK; unsigned nr_reserve = watermark > BCH_WATERMARK_reclaim ? BTREE_NODE_RESERVE @@ -272,36 +270,20 @@ static struct btree *__bch2_btree_node_alloc(struct btree_trans *trans, } mutex_unlock(&c->btree_reserve_cache_lock); -retry: - ret = bch2_alloc_sectors_start_trans(trans, + bkey_btree_ptr_v2_init(&tmp.k); + ret = bch2_alloc_sectors_trans(trans, c->opts.metadata_target ?: c->opts.foreground_target, 0, writepoint_ptr(&c->btree_write_point), - &devs_have, res->nr_replicas, c->opts.metadata_replicas_required, - watermark, 0, cl, &wp); + watermark, 0, + btree_sectors(c), + cl, &obs, &tmp.k); if (unlikely(ret)) return ERR_PTR(ret); - if (wp->sectors_free < btree_sectors(c)) { - struct open_bucket *ob; - unsigned i; - - open_bucket_for_each(c, &wp->ptrs, ob, i) - if (ob->sectors_free < btree_sectors(c)) - ob->sectors_free = 0; - - bch2_alloc_sectors_done(c, wp); - goto retry; - } - - bkey_btree_ptr_v2_init(&tmp.k); - bch2_alloc_sectors_append_ptrs(c, wp, &tmp.k, btree_sectors(c), false); - - bch2_open_bucket_get(c, wp, &obs); - bch2_alloc_sectors_done(c, wp); mem_alloc: b = bch2_btree_node_mem_alloc(trans, interior_node); six_unlock_write(&b->c.lock); |