• Coly Li's avatar
    bcache: handle cache prio_buckets and disk_buckets properly for bucket size > 8MB · c954ac8d
    Coly Li authored
    Similar to c->uuids, struct cache's prio_buckets and disk_buckets also
    have the potential memory allocation failure during cache registration
    if the bucket size > 8MB.
    
    ca->prio_buckets can be stored on cache device in multiple buckets, its
    in-memory space is allocated by kzalloc() interface but normally
    allocated by alloc_pages() because the size > KMALLOC_MAX_CACHE_SIZE.
    
    So allocation of ca->prio_buckets has the MAX_ORDER restriction too. If
    the bucket size > 8MB, by default the page allocator will fail because
    the page order > 11 (default MAX_ORDER value). ca->prio_buckets should
    also use meta_bucket_bytes(), meta_bucket_pages() to decide its memory
    size and use alloc_meta_bucket_pages() to allocate pages, to avoid the
    allocation failure during cache set registration when bucket size > 8MB.
    
    ca->disk_buckets is a single bucket size memory buffer, it is used to
    iterate each bucket of ca->prio_buckets, and compose the bio based on
    memory of ca->disk_buckets, then write ca->disk_buckets memory to cache
    disk one-by-one for each bucket of ca->prio_buckets. ca->disk_buckets
    should have in-memory size exact to the meta_bucket_pages(), this is the
    size that ca->prio_buckets will be stored into each on-disk bucket.
    
    This patch fixes the above issues and handle cache's prio_buckets and
    disk_buckets properly for bucket size larger than 8MB.
    Signed-off-by: default avatarColy Li <colyli@suse.de>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    c954ac8d
super.c 71.6 KB