You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.8 KiB
66 lines
2.8 KiB
7 years ago
|
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 1995e3c0b..fc73e263a 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) {
|