bcachefs: plumb data_type into bch2_bucket_alloc_trans()
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 20 Apr 2024 20:10:40 +0000 (16:10 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 8 May 2024 21:29:20 +0000 (17:29 -0400)
prep work for making the allocator try to keep btree nodes within the
existing member info btree allocated bitmap

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_foreground.c
fs/bcachefs/alloc_foreground.h
fs/bcachefs/journal.c

index 6cb878f5e5ebb01cb5d68ee5e38aa85c11695785..847000a7ead2be1259a565e0966bff7cad08a575 100644 (file)
@@ -516,6 +516,7 @@ again:
  * @trans:     transaction object
  * @ca:                device to allocate from
  * @watermark: how important is this allocation?
+ * @data_type: BCH_DATA_journal, btree, user...
  * @cl:                if not NULL, closure to be used to wait if buckets not available
  * @usage:     for secondarily also returning the current device usage
  *
@@ -524,6 +525,7 @@ again:
 static struct open_bucket *bch2_bucket_alloc_trans(struct btree_trans *trans,
                                      struct bch_dev *ca,
                                      enum bch_watermark watermark,
+                                     enum bch_data_type data_type,
                                      struct closure *cl,
                                      struct bch_dev_usage *usage)
 {
@@ -577,6 +579,9 @@ err:
        if (!ob)
                ob = ERR_PTR(-BCH_ERR_no_buckets_found);
 
+       if (!IS_ERR(ob))
+               ob->data_type = data_type;
+
        if (!IS_ERR(ob))
                trace_and_count(c, bucket_alloc, ca,
                                bch2_watermarks[watermark],
@@ -605,6 +610,7 @@ err:
 
 struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca,
                                      enum bch_watermark watermark,
+                                     enum bch_data_type data_type,
                                      struct closure *cl)
 {
        struct bch_dev_usage usage;
@@ -612,7 +618,7 @@ struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca,
 
        bch2_trans_do(c, NULL, NULL, 0,
                      PTR_ERR_OR_ZERO(ob = bch2_bucket_alloc_trans(trans, ca, watermark,
-                                                       cl, &usage)));
+                                                       data_type, cl, &usage)));
        return ob;
 }
 
@@ -738,7 +744,7 @@ int bch2_bucket_alloc_set_trans(struct btree_trans *trans,
                        continue;
                }
 
-               ob = bch2_bucket_alloc_trans(trans, ca, watermark, cl, &usage);
+               ob = bch2_bucket_alloc_trans(trans, ca, watermark, data_type, cl, &usage);
                if (!IS_ERR(ob))
                        bch2_dev_stripe_increment_inlined(ca, stripe, &usage);
                percpu_ref_put(&ca->ref);
@@ -750,8 +756,6 @@ int bch2_bucket_alloc_set_trans(struct btree_trans *trans,
                        continue;
                }
 
-               ob->data_type = data_type;
-
                if (add_new_bucket(c, ptrs, devs_may_alloc,
                                   nr_replicas, nr_effective,
                                   have_cache, flags, ob)) {
index c101b2c367439ca15053ed04a4c3cfdddf2c9494..f0339eb7e30e90493172aacafbe85b4a5d79634f 100644 (file)
@@ -31,7 +31,8 @@ void bch2_dev_stripe_increment(struct bch_dev *, struct dev_stripe_state *);
 long bch2_bucket_alloc_new_fs(struct bch_dev *);
 
 struct open_bucket *bch2_bucket_alloc(struct bch_fs *, struct bch_dev *,
-                                     enum bch_watermark, struct closure *);
+                                     enum bch_watermark, enum bch_data_type,
+                                     struct closure *);
 
 static inline void ob_push(struct bch_fs *c, struct open_buckets *obs,
                           struct open_bucket *ob)
index 17ceddbd88582aac2528b8aa085f711bf3a7129e..4d03a77f1e837790a3d739d497e3e06063f6a663 100644 (file)
@@ -938,7 +938,8 @@ static int __bch2_set_nr_journal_buckets(struct bch_dev *ca, unsigned nr,
                                break;
                        }
                } else {
-                       ob[nr_got] = bch2_bucket_alloc(c, ca, BCH_WATERMARK_normal, cl);
+                       ob[nr_got] = bch2_bucket_alloc(c, ca, BCH_WATERMARK_normal,
+                                                      BCH_DATA_journal, cl);
                        ret = PTR_ERR_OR_ZERO(ob[nr_got]);
                        if (ret)
                                break;