• Mikulas Patocka's avatar
    dm: send just one event on resize, not two · 7533afa1
    Mikulas Patocka authored
    Device mapper sends an uevent when the device is suspended, using the
    function set_capacity_and_notify. However, this causes a race condition
    with udev.
    
    Udev skips scanning dm devices that are suspended. If we send an uevent
    while we are suspended, udev will be racing with device mapper resume
    code. If the device mapper resume code wins the race, udev will process
    the uevent after the device is resumed and it will properly scan the
    device.
    
    However, if udev wins the race, it will receive the uevent, find out that
    the dm device is suspended and skip scanning the device. This causes bugs
    such as systemd unmounting the device - see
    https://bugzilla.redhat.com/show_bug.cgi?id=2158628
    
    This commit fixes this race.
    
    We replace the function set_capacity_and_notify with set_capacity, so that
    the uevent is not sent at this point. In do_resume, we detect if the
    capacity has changed and we pass a boolean variable need_resize_uevent to
    dm_kobject_uevent. dm_kobject_uevent adds "RESIZE=1" to the uevent if
    need_resize_uevent is set.
    Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Tested-by: default avatarPeter Rajnoha <prajnoha@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarMike Snitzer <snitzer@kernel.org>
    7533afa1
dm.h 6.65 KB