for_each_member_device(c, ca) {
                BUG_ON(ca->buckets_nouse);
 
-               ca->buckets_nouse = kvmalloc(BITS_TO_LONGS(ca->mi.nbuckets) *
+               ca->buckets_nouse = bch2_kvmalloc(BITS_TO_LONGS(ca->mi.nbuckets) *
                                            sizeof(unsigned long),
                                            GFP_KERNEL|__GFP_ZERO);
                if (!ca->buckets_nouse) {
        if (resize && ca->buckets_nouse)
                return -BCH_ERR_no_resize_with_buckets_nouse;
 
-       bucket_gens = kvmalloc(struct_size(bucket_gens, b, nbuckets),
-                              GFP_KERNEL|__GFP_ZERO);
+       bucket_gens = bch2_kvmalloc(struct_size(bucket_gens, b, nbuckets),
+                                   GFP_KERNEL|__GFP_ZERO);
        if (!bucket_gens) {
                ret = -BCH_ERR_ENOMEM_bucket_gens;
                goto err;
 
                            PAGE_SIZE);
 }
 
+static inline void *bch2_kvmalloc(size_t n, gfp_t flags)
+{
+       void *p = unlikely(n >= INT_MAX)
+               ? vmalloc(n)
+               : kvmalloc(n, flags & ~__GFP_ZERO);
+       if (p && (flags & __GFP_ZERO))
+               memset(p, 0, n);
+       return p;
+}
+
 #define init_heap(heap, _size, gfp)                                    \
 ({                                                                     \
        (heap)->nr = 0;                                         \