• Coly Li's avatar
    bcache: rewrite multiple partitions support · 1dbe32ad
    Coly Li authored
    Current partition support of bcache is confusing and buggy. It tries to
    trace non-continuous device minor numbers by an ida bit string, and
    mistakenly mixed bcache device index with minor numbers. This design
    generates several negative results,
    - Index of bcache device name is not consecutive under /dev/. If there are
      3 bcache devices, they name will be,
      /dev/bcache0, /dev/bcache16, /dev/bcache32
      Only bcache code indexes bcache device name is such an interesting way.
    - First minor number of each bcache device is traced by ida bit string.
      One bcache device will occupy 16 bits, this is not a good idea. Indeed
      only one bit is enough.
    - Because minor number and bcache device index are mixed, a device index
      is allocated by ida_simple_get(), but an first minor number is sent into
      ida_simple_remove() to release the device. It confused original author
      too.
    
    Root cause of the above errors is, bcache code should not handle device
    minor numbers at all! A standard process to support multiple partitions in
    Linux kernel is,
    - Device driver provides major device number, and indexes multiple device
      instances.
    - Device driver does not allocat nor trace device minor number, only
      provides a first minor number of a given device instance, and sets how
      many minor numbers (paritions) the device instance may have.
    All rested stuffs are handled by block layer code, most of the details can
    be found from block/{genhd, partition-generic}.c files.
    
    This patch re-writes multiple partitions support for bcache. It makes
    whole things to be more clear, and uses ida bit string in a more efficeint
    way.
    - Ida bit string only traces bcache device index, not minor number. For a
      bcache device with 128 partitions, only one bit in ida bit string is
      enough.
    - Device minor number and device index are separated in concept. Device
      index is used for /dev node naming, and ida bit string trace. Minor
      number is calculated from device index and only used to initialize
      first_minor of a bcache device.
    - It does not follow any standard for 16 partitions on a bcache device.
      This patch sets 128 partitions on single bcache device at max, this is
      the limitation from GPT (GUID Partition Table) and supported by fdisk.
    
    Considering a typical device minor number is 20 bits width, each bcache
    device may have 128 partitions (7 bits), there can be 8192 bcache devices
    existing on system. For most common deployment for a single server in
    now days, it should be enough.
    
    [minor spelling fixes in commit message by Michael Lyle]
    Signed-off-by: default avatarColy Li <colyli@suse.de>
    Cc: Eric Wheeler <bcache@lists.ewheeler.net>
    Cc: Junhui Tang <tang.junhui@zte.com.cn>
    Reviewed-by: default avatarMichael Lyle <mlyle@lyle.org>
    Signed-off-by: default avatarMichael Lyle <mlyle@lyle.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    1dbe32ad
super.c 50.8 KB