• Mike Snitzer's avatar
    block: allow gendisk's request_queue registration to be deferred · fa70d2e2
    Mike Snitzer authored
    Since I can remember DM has forced the block layer to allow the
    allocation and initialization of the request_queue to be distinct
    operations.  Reason for this is block/genhd.c:add_disk() has requires
    that the request_queue (and associated bdi) be tied to the gendisk
    before add_disk() is called -- because add_disk() also deals with
    exposing the request_queue via blk_register_queue().
    
    DM's dynamic creation of arbitrary device types (and associated
    request_queue types) requires the DM device's gendisk be available so
    that DM table loads can establish a master/slave relationship with
    subordinate devices that are referenced by loaded DM tables -- using
    bd_link_disk_holder().  But until these DM tables, and their associated
    subordinate devices, are known DM cannot know what type of request_queue
    it needs -- nor what its queue_limits should be.
    
    This chicken and egg scenario has created all manner of problems for DM
    and, at times, the block layer.
    
    Summary of changes:
    
    - Add device_add_disk_no_queue_reg() and add_disk_no_queue_reg() variant
      that drivers may use to add a disk without also calling
      blk_register_queue().  Driver must call blk_register_queue() once its
      request_queue is fully initialized.
    
    - Return early from blk_unregister_queue() if QUEUE_FLAG_REGISTERED
      is not set.  It won't be set if driver used add_disk_no_queue_reg()
      but driver encounters an error and must del_gendisk() before calling
      blk_register_queue().
    
    - Export blk_register_queue().
    
    These changes allow DM to use add_disk_no_queue_reg() to anchor its
    gendisk as the "master" for master/slave relationships DM must establish
    with subordinate devices referenced in DM tables that get loaded.  Once
    all "slave" devices for a DM device are known its request_queue can be
    properly initialized and then advertised via sysfs -- important
    improvement being that no request_queue resource initialization
    performed by blk_register_queue() is missed for DM devices anymore.
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    Reviewed-by: default avatarMing Lei <ming.lei@redhat.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    fa70d2e2
genhd.c 48.2 KB