• Coly Li's avatar
    bcache: handle cache set verify_ondisk properly for bucket size > 8MB · bf6af170
    Coly Li authored
    In bch_btree_cache_alloc() when CONFIG_BCACHE_DEBUG is configured,
    allocate memory for c->verify_ondisk may fail if the bucket size > 8MB,
    which will require __get_free_pages() to allocate continuous pages
    with order > 11 (the default MAX_ORDER of Linux buddy allocator). Such
    over size allocation will fail, and cause 2 problems,
    - When CONFIG_BCACHE_DEBUG is configured,  bch_btree_verify() does not
      work, because c->verify_ondisk is NULL and bch_btree_verify() returns
      immediately.
    - bch_btree_cache_alloc() will fail due to c->verify_ondisk allocation
      failed, then the whole cache device registration fails. And because of
      this failure, the first problem of bch_btree_verify() has no chance to
      be triggered.
    
    This patch fixes the above problem by two means,
    1) If pages allocation of c->verify_ondisk fails, set it to NULL and
       returns bch_btree_cache_alloc() with -ENOMEM.
    2) When calling __get_free_pages() to allocate c->verify_ondisk pages,
       use ilog2(meta_bucket_pages(&c->sb)) to make sure ilog2() will always
       generate a pages order <= MAX_ORDER (or CONFIG_FORCE_MAX_ZONEORDER).
       Then the buddy system won't directly reject the allocation request.
    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>
    bf6af170
btree.c 62.8 KB