• Alex Elder's avatar
    rbd: don't drop the rbd_id too early · 32eec68d
    Alex Elder authored
    Currently an rbd device's id is released when it is removed, but it
    is done before the code is run to clean up sysfs-related files (such
    as /sys/bus/rbd/devices/1).
    
    It's possible that an rbd is still in use after the rbd_remove()
    call has been made.  It's essentially the same as an active inode
    that stays around after it has been removed--until its final close
    operation.  This means that the id shows up as free for reuse at a
    time it should not be.
    
    The effect of this was seen by Jens Rehpoehler, who:
        - had a filesystem mounted on an rbd device
        - unmapped that filesystem (without unmounting)
        - found that the mount still worked properly
        - but hit a panic when he attempted to re-map a new rbd device
    
    This re-map attempt found the previously-unmapped id available.
    The subsequent attempt to reuse it was met with a panic while
    attempting to (re-)install the sysfs entry for the new mapped
    device.
    
    Fix this by holding off "putting" the rbd id, until the rbd_device
    release function is called--when the last reference is finally
    dropped.
    
    Note: This fixes: http://tracker.newdream.net/issues/1907Signed-off-by: default avatarAlex Elder <elder@dreamhost.com>
    Signed-off-by: default avatarSage Weil <sage@newdream.net>
    32eec68d
rbd.c 58.5 KB