]> git.ipfire.org Git - thirdparty/systemd.git/commit
udevd: fix synchronization with settle when handling inotify events
authorDaniel Drake <drake@endlessm.com>
Mon, 6 Apr 2015 22:03:43 +0000 (16:03 -0600)
committerDavid Herrmann <dh.herrmann@gmail.com>
Sat, 11 Apr 2015 11:10:52 +0000 (13:10 +0200)
commit07ba8037bf2a2d6a683fa107ee6f2b9545fca23e
treee1f05d24b768f0effbfbea6cf58302d82c2c3106
parentaf97ebf2dd8a2ec0d46f2924e35a63a55523c133
udevd: fix synchronization with settle when handling inotify events

udev uses inotify to implement a scheme where when the user closes
a writable device node, a change uevent is forcefully generated.
In the case of block devices, it actually requests a partition rescan.

This currently can't be synchronized with "udevadm settle", i.e. this
is not reliable in a script:

 sfdisk --change-id /dev/sda 1 81
 udevadm settle
 mount /dev/sda1 /foo

The settle call doesn't synchronize there, so at the same time we try
to mount the device, udevd is busy removing the partition device nodes and
readding them again. The mount call often happens in that moment where the
partition node has been removed but not readded yet.

This exact issue was fixed long ago:
http://git.kernel.org/cgit/linux/hotplug/udev.git/commit/?id=bb38678e3ccc02bcd970ccde3d8166a40edf92d3

but that fix is no longer valid now that sequence numbers are no longer
used.

Fix this by forcing another mainloop iteration after handling inotify events
before unblocking settle. If the inotify event caused us to generate a
"change" event, we'll pick that up in the following loop iteration, before
we reach the end of the loop where we respond to settle's control message,
unblocking it.
src/udev/udevd.c