summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-12-20 23:08:41 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-12-23 23:40:46 -0500
commit1b4fba9837e14617ca187963135ebdea742fcce4 (patch)
treea41d43bdec6cafc8d9c6a63ff8cb5c42fc115144
parentb71ae58d2b93d0e4f6a365ec9f771d3870510fd1 (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.c45
-rw-r--r--fs/bcachefs/alloc_foreground.h9
-rw-r--r--fs/bcachefs/btree_update_interior.c28
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);