bcachefs: Split out dev_buckets_free()
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 14 Jun 2022 21:51:20 +0000 (17:51 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:34 +0000 (17:09 -0400)
Previously, dev_buckets_available() only counted buckets that are
eligible to be allocated right now - i.e. buckets that don't have cached
data, or need discard, or need gc gens, etc.

But most users of this function want to know how many buckets are
eligible to be allocated from without moving data around - copygc,
allocator striping, which means we should be including cached data
buckets etc.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/alloc_foreground.c
fs/bcachefs/buckets.h

index ef8f10a51489d893396ec9eaca4750b2bdac498b..174b3a745ab8fd5565faea25f7ede167f35f259f 100644 (file)
@@ -526,7 +526,7 @@ static struct open_bucket *bch2_bucket_alloc_trans(struct btree_trans *trans,
        bool waiting = false;
 again:
        usage = bch2_dev_usage_read(ca);
-       avail = __dev_buckets_available(ca, usage,reserve);
+       avail = dev_buckets_free(ca, usage,reserve);
 
        if (usage.d[BCH_DATA_need_discard].buckets > avail)
                bch2_do_discards(c);
index 327022cd0f7acfdf98756a53b4c489d8978932b5..080bcb20a5b0296d4f224b7c181bd817702692c0 100644 (file)
@@ -144,12 +144,25 @@ static inline u64 bch2_dev_buckets_reserved(struct bch_dev *ca, enum alloc_reser
        return reserved;
 }
 
+static inline u64 dev_buckets_free(struct bch_dev *ca,
+                                  struct bch_dev_usage usage,
+                                  enum alloc_reserve reserve)
+{
+       return max_t(s64, 0,
+                    usage.d[BCH_DATA_free].buckets -
+                    ca->nr_open_buckets -
+                    bch2_dev_buckets_reserved(ca, reserve));
+}
+
 static inline u64 __dev_buckets_available(struct bch_dev *ca,
                                          struct bch_dev_usage usage,
                                          enum alloc_reserve reserve)
 {
        return max_t(s64, 0,
                     usage.d[BCH_DATA_free].buckets -
+                    usage.d[BCH_DATA_cached].buckets -
+                    usage.d[BCH_DATA_need_gc_gens].buckets -
+                    usage.d[BCH_DATA_need_discard].buckets -
                     ca->nr_open_buckets -
                     bch2_dev_buckets_reserved(ca, reserve));
 }