summaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-ps-queue-length.c
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2023-02-07 14:33:06 +0100
committerMike Snitzer <snitzer@kernel.org>2023-02-14 20:22:27 +0100
commit7533afa1d27ba1234146d31d2402c195cf195962 (patch)
tree64490afdc31e9b2a2787f9c836de1a50e8ee5e12 /drivers/md/dm-ps-queue-length.c
parentdm table: check that a dm device doesn't reference itself (diff)
downloadlinux-7533afa1d27ba1234146d31d2402c195cf195962.tar.xz
linux-7533afa1d27ba1234146d31d2402c195cf195962.zip
dm: send just one event on resize, not two
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: Mikulas Patocka <mpatocka@redhat.com> Tested-by: Peter Rajnoha <prajnoha@redhat.com> Cc: stable@vger.kernel.org Signed-off-by: Mike Snitzer <snitzer@kernel.org>
Diffstat (limited to 'drivers/md/dm-ps-queue-length.c')
0 files changed, 0 insertions, 0 deletions