X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fudev%2Fudevd.c;h=a45d3240c6661165b35b92b4f6bcab62e2a8dda8;hb=934e9b10b4f4bfb48e21883670c7f45b6911fa9b;hp=81e3f69a3a7cc3e9e59c47cd3efe87662af04f99;hpb=e9fc29f4ecc9509ccc02eb8a014341e26c0d7831;p=elogind.git diff --git a/src/udev/udevd.c b/src/udev/udevd.c index 81e3f69a3..a45d3240c 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -304,7 +304,7 @@ static void worker_new(struct event *event) * IMHO this sounds like a good plan for this moment */ if (streq_ptr("block", udev_device_get_subsystem(dev)) && - !startswith("dm-", udev_device_get_sysname(dev))) { + !startswith(udev_device_get_sysname(dev), "dm-")) { struct udev_device *d = dev; if (streq_ptr("partition", udev_device_get_devtype(d))) @@ -741,7 +741,7 @@ static int synthesize_change(struct udev_device *dev) { if (streq_ptr("block", udev_device_get_subsystem(dev)) && streq_ptr("disk", udev_device_get_devtype(dev)) && - !startswith("dm-", udev_device_get_sysname(dev))) { + !startswith(udev_device_get_sysname(dev), "dm-")) { bool part_table_read = false; bool has_partitions = false; int fd; @@ -755,9 +755,12 @@ static int synthesize_change(struct udev_device *dev) { * partition table is found, and we will not get an event for * the disk. */ - fd = open(udev_device_get_devnode(dev), O_RDONLY|O_EXCL|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK); + fd = open(udev_device_get_devnode(dev), O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK); if (fd >= 0) { - r = ioctl(fd, BLKRRPART, 0); + r = flock(fd, LOCK_EX|LOCK_NB); + if (r >= 0) + r = ioctl(fd, BLKRRPART, 0); + close(fd); if (r >= 0) part_table_read = true; @@ -777,6 +780,8 @@ static int synthesize_change(struct udev_device *dev) { return r; r = udev_enumerate_scan_devices(e); + if (r < 0) + return r; udev_list_entry_foreach(item, udev_enumerate_get_list_entry(e)) { _cleanup_udev_device_unref_ struct udev_device *d = NULL;