diff --git a/src/udev/udev-watch.c b/src/udev/udev-watch.c index c28c43b2af..1b8e2b8dbd 100644 --- a/src/udev/udev-watch.c +++ b/src/udev/udev-watch.c @@ -181,6 +181,9 @@ int udev_watch_begin(int inotify_fd, sd_device *dev) { assert(inotify_fd >= 0); assert(dev); + /* Ignore the request of watching the device node on remove event, as the device node specified by + * DEVNAME= has already been removed, and may already be assigned to another device. Consider the + * case e.g. a USB stick memory was unplugged and then another one is plugged. */ if (device_for_action(dev, SD_DEVICE_REMOVE)) return 0; diff --git a/src/udev/udev-worker.c b/src/udev/udev-worker.c index 7f22faccdc..59f56f653c 100644 --- a/src/udev/udev-worker.c +++ b/src/udev/udev-worker.c @@ -97,6 +97,12 @@ static int worker_lock_whole_disk(sd_device *dev, int *ret_fd) { * event handling; in the case udev acquired the lock, the external process can block until udev has * finished its event handling. */ + /* Do not try to lock device on remove event, as the device node specified by DEVNAME= has already + * been removed, and may already be assigned to another device. Consider the case e.g. a USB stick + * memory was unplugged and then another one is plugged. */ + if (device_for_action(dev, SD_DEVICE_REMOVE)) + goto nolock; + r = udev_get_whole_disk(dev, &dev_whole_disk, &val); if (r < 0) return r;