|
|
|
From 45ff3d79f079c73c73209940cf6eaa0ea0a95708 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Franck Bui <fbui@suse.com>
|
|
|
|
Date: Fri, 22 Jan 2016 07:18:19 +0100
|
|
|
|
Subject: [PATCH] device: make sure to not ignore re-plugged device
|
|
|
|
|
|
|
|
systemd automatically mounts device unless 'noauto' is part of the
|
|
|
|
mount options. This can happen during boot if the device is plugged at
|
|
|
|
that time or later when the system is already running (the latter case
|
|
|
|
is not documented AFAICS).
|
|
|
|
|
|
|
|
After the systemd booted, I plugged my USB device which had an entry
|
|
|
|
in /etc/fstab with the default options and systemd automatically
|
|
|
|
mounted it.
|
|
|
|
|
|
|
|
However I noticed that if I unplugged and re-plugged the device the
|
|
|
|
automatic mounting of the device didn't work anymore: systemd didn't
|
|
|
|
notice that the device was re-plugged.
|
|
|
|
|
|
|
|
This was due to the device unit which was not recycled by the GC
|
|
|
|
during the unplug event because in the case of automounting, the mount
|
|
|
|
unit still referenced it. When the device was re-plugged, the old
|
|
|
|
device unit was reused but it still had the old sysfs path (amongst
|
|
|
|
other useful information).
|
|
|
|
|
|
|
|
Systemd was confused by the stalled sysfs path and decided to ignore
|
|
|
|
the plug event.
|
|
|
|
|
|
|
|
This patch fixes this issue by simply not doing the sanity checking on
|
|
|
|
the sysfs path if the device is in unplugged state.
|
|
|
|
|
|
|
|
Cherry-picked from: ac9d396b2abbae4e7ab84f7b556f70681b66236b
|
|
|
|
Resolves: #1332606
|
|
|
|
---
|
|
|
|
src/core/device.c | 18 +++++++++++++-----
|
|
|
|
1 file changed, 13 insertions(+), 5 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/src/core/device.c b/src/core/device.c
|
|
|
|
index 1995e3c0b4..fc73e263ab 100644
|
|
|
|
--- a/src/core/device.c
|
|
|
|
+++ b/src/core/device.c
|
|
|
|
@@ -314,11 +314,19 @@ static int device_setup_unit(Manager *m, struct udev_device *dev, const char *pa
|
|
|
|
|
|
|
|
u = manager_get_unit(m, e);
|
|
|
|
|
|
|
|
- if (u &&
|
|
|
|
- DEVICE(u)->sysfs &&
|
|
|
|
- !path_equal(DEVICE(u)->sysfs, sysfs)) {
|
|
|
|
- log_unit_debug(u->id, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
|
|
|
|
- return -EEXIST;
|
|
|
|
+ /* The device unit can still be present even if the device was
|
|
|
|
+ * unplugged: a mount unit can reference it hence preventing
|
|
|
|
+ * the GC to have garbaged it. That's desired since the device
|
|
|
|
+ * unit may have a dependency on the mount unit which was
|
|
|
|
+ * added during the loading of the later. */
|
|
|
|
+ if (u && DEVICE(u)->state == DEVICE_PLUGGED) {
|
|
|
|
+ /* This unit is in plugged state: we're sure it's
|
|
|
|
+ * attached to a device. */
|
|
|
|
+ if (!path_equal(DEVICE(u)->sysfs, sysfs)) {
|
|
|
|
+ log_unit_debug(u->id, "Dev %s appeared twice with different sysfs paths %s and %s",
|
|
|
|
+ e, DEVICE(u)->sysfs, sysfs);
|
|
|
|
+ return -EEXIST;
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!u) {
|