]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bcachefs: Replace bucket_valid() asserts in bucket lookup with proper checks
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 6 Jun 2024 18:50:06 +0000 (14:50 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 10 Jun 2024 17:17:16 +0000 (13:17 -0400)
The bucket_gens array and gc_buckets array known their own size; we
should be using those members, and returning an error.

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

index dc97991bcd6adad823121fd27f6f89889ce9a0d6..130a0131cd73e41b79046e74f49b3c4bdfa58e07 100644 (file)
@@ -990,6 +990,8 @@ static int bch2_gc_alloc_start(struct bch_fs *c)
 
                buckets->first_bucket   = ca->mi.first_bucket;
                buckets->nbuckets       = ca->mi.nbuckets;
+               buckets->nbuckets_minus_first =
+                       buckets->nbuckets - buckets->first_bucket;
                rcu_assign_pointer(ca->buckets_gc, buckets);
        }
 
index 75a54ed977d7266b8ff00259de712cfc9d320947..99a7824d0de2d8c070f0e8fa98dd27f810f1f416 100644 (file)
@@ -1612,6 +1612,8 @@ int bch2_dev_buckets_resize(struct bch_fs *c, struct bch_dev *ca, u64 nbuckets)
 
        bucket_gens->first_bucket = ca->mi.first_bucket;
        bucket_gens->nbuckets   = nbuckets;
+       bucket_gens->nbuckets_minus_first =
+               bucket_gens->nbuckets - bucket_gens->first_bucket;
 
        if (resize) {
                down_write(&c->gc_lock);
index 617ffde2fb7ad96f3c4c0e0b101df98a8cba7b51..e1a5e3082bbfb8d2d0316d71ba1288ebace93f40 100644 (file)
@@ -93,7 +93,8 @@ static inline struct bucket *gc_bucket(struct bch_dev *ca, size_t b)
 {
        struct bucket_array *buckets = gc_bucket_array(ca);
 
-       BUG_ON(!bucket_valid(ca, b));
+       if (b - buckets->first_bucket >= buckets->nbuckets_minus_first)
+               return NULL;
        return buckets->b + b;
 }
 
@@ -110,7 +111,8 @@ static inline u8 *bucket_gen(struct bch_dev *ca, size_t b)
 {
        struct bucket_gens *gens = bucket_gens(ca);
 
-       BUG_ON(!bucket_valid(ca, b));
+       if (b - gens->first_bucket >= gens->nbuckets_minus_first)
+               return NULL;
        return gens->b + b;
 }
 
index 6a31740222a7132e3f0735675ba63ed3402f00a8..f636e17c4cafe0a62ed0d732a3b69d67610eb901 100644 (file)
@@ -22,6 +22,7 @@ struct bucket_array {
        struct rcu_head         rcu;
        u16                     first_bucket;
        size_t                  nbuckets;
+       size_t                  nbuckets_minus_first;
        struct bucket           b[];
 };
 
@@ -29,6 +30,7 @@ struct bucket_gens {
        struct rcu_head         rcu;
        u16                     first_bucket;
        size_t                  nbuckets;
+       size_t                  nbuckets_minus_first;
        u8                      b[];
 };