• Mikulas Patocka's avatar
    dm: fix a race condition in dm_get_md · ed68077f
    Mikulas Patocka authored
    commit 2bec1f4a upstream.
    
    The function dm_get_md finds a device mapper device with a given dev_t,
    increases the reference count and returns the pointer.
    
    dm_get_md calls dm_find_md, dm_find_md takes _minor_lock, finds the
    device, tests that the device doesn't have DMF_DELETING or DMF_FREEING
    flag, drops _minor_lock and returns pointer to the device. dm_get_md then
    calls dm_get. dm_get calls BUG if the device has the DMF_FREEING flag,
    otherwise it increments the reference count.
    
    There is a possible race condition - after dm_find_md exits and before
    dm_get is called, there are no locks held, so the device may disappear or
    DMF_FREEING flag may be set, which results in BUG.
    
    To fix this bug, we need to call dm_get while we hold _minor_lock. This
    patch renames dm_find_md to dm_get_md and changes it so that it calls
    dm_get while holding the lock.
    Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ed68077f
dm.c 69.3 KB