• Alex Elder's avatar
    rbd: avoid dropping extra reference in rbd_free_disk() · a0cab924
    Alex Elder authored
    I found during some failure injection testing that the call to
    rbd_free_disk() in the error path of rbd_dev_probe_finish() was
    dropping an extra reference to the disk queue.  The problem
    occurred when put_disk tried to drop a reference to the disk's
    queue.  A call to blk_cleanup_queue() just prior to that will have
    also dropped a reference to the queue.
    
    The problem is that the reference dropped by put_disk() is assumed
    to have been taken by add_disk().  Our code has error paths that can
    occur after the disk and its queue are initialized, but before the
    call to add_disk(), and in those paths we won't have that extra
    reference.
    
    The fix is easy though.  In rbd_free_disk() we're already checking
    the disk's GENHD_FL_UP flag.  That flag is an indication that
    add_disk() has been called, so just call blk_cleanup_queue()
    conditional on that flag being set.
    
    This resolves:
        http://tracker.ceph.com/issues/4800Signed-off-by: default avatarAlex Elder <elder@inktank.com>
    Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
    a0cab924
rbd.c 128 KB