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>
 
                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);
        }
 
 
 
        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);
 
 {
        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;
 }
 
 {
        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;
 }
 
 
        struct rcu_head         rcu;
        u16                     first_bucket;
        size_t                  nbuckets;
+       size_t                  nbuckets_minus_first;
        struct bucket           b[];
 };
 
        struct rcu_head         rcu;
        u16                     first_bucket;
        size_t                  nbuckets;
+       size_t                  nbuckets_minus_first;
        u8                      b[];
 };