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.
65 lines
2.8 KiB
65 lines
2.8 KiB
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) {
|
|
|