1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23 #include <sys/epoll.h>
27 #include "unit-name.h"
28 #include "dbus-device.h"
29 #include "path-util.h"
30 #include "udev-util.h"
35 static const UnitActiveState state_translation_table
[_DEVICE_STATE_MAX
] = {
36 [DEVICE_DEAD
] = UNIT_INACTIVE
,
37 [DEVICE_TENTATIVE
] = UNIT_ACTIVATING
,
38 [DEVICE_PLUGGED
] = UNIT_ACTIVE
,
41 static int device_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
43 static void device_unset_sysfs(Device
*d
) {
52 /* Remove this unit from the chain of devices which share the
54 devices
= UNIT(d
)->manager
->devices_by_sysfs
;
55 first
= hashmap_get(devices
, d
->sysfs
);
56 LIST_REMOVE(same_sysfs
, first
, d
);
59 hashmap_remove_and_replace(devices
, d
->sysfs
, first
->sysfs
, first
);
61 hashmap_remove(devices
, d
->sysfs
);
63 d
->sysfs
= mfree(d
->sysfs
);
66 static int device_set_sysfs(Device
*d
, const char *sysfs
) {
73 if (streq_ptr(d
->sysfs
, sysfs
))
76 r
= hashmap_ensure_allocated(&UNIT(d
)->manager
->devices_by_sysfs
, &string_hash_ops
);
84 device_unset_sysfs(d
);
86 first
= hashmap_get(UNIT(d
)->manager
->devices_by_sysfs
, sysfs
);
87 LIST_PREPEND(same_sysfs
, first
, d
);
89 r
= hashmap_replace(UNIT(d
)->manager
->devices_by_sysfs
, copy
, first
);
91 LIST_REMOVE(same_sysfs
, first
, d
);
101 static void device_init(Unit
*u
) {
102 Device
*d
= DEVICE(u
);
105 assert(UNIT(d
)->load_state
== UNIT_STUB
);
107 /* In contrast to all other unit types we timeout jobs waiting
108 * for devices by default. This is because they otherwise wait
109 * indefinitely for plugged in devices, something which cannot
110 * happen for the other units since their operations time out
112 u
->job_timeout
= u
->manager
->default_timeout_start_usec
;
114 u
->ignore_on_isolate
= true;
115 u
->ignore_on_snapshot
= true;
118 static void device_done(Unit
*u
) {
119 Device
*d
= DEVICE(u
);
123 device_unset_sysfs(d
);
126 static void device_set_state(Device
*d
, DeviceState state
) {
127 DeviceState old_state
;
130 old_state
= d
->state
;
133 if (state
!= old_state
)
134 log_unit_debug(UNIT(d
), "Changed %s -> %s", device_state_to_string(old_state
), device_state_to_string(state
));
136 unit_notify(UNIT(d
), state_translation_table
[old_state
], state_translation_table
[state
], true);
139 static int device_coldplug(Unit
*u
) {
140 Device
*d
= DEVICE(u
);
143 assert(d
->state
== DEVICE_DEAD
);
145 if (d
->found
& DEVICE_FOUND_UDEV
)
146 /* If udev says the device is around, it's around */
147 device_set_state(d
, DEVICE_PLUGGED
);
148 else if (d
->found
!= DEVICE_NOT_FOUND
&& d
->deserialized_state
!= DEVICE_PLUGGED
)
149 /* If a device is found in /proc/self/mountinfo or
150 * /proc/swaps, and was not yet announced via udev,
151 * it's "tentatively" around. */
152 device_set_state(d
, DEVICE_TENTATIVE
);
157 static int device_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
158 Device
*d
= DEVICE(u
);
164 unit_serialize_item(u
, f
, "state", device_state_to_string(d
->state
));
169 static int device_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
170 Device
*d
= DEVICE(u
);
177 if (streq(key
, "state")) {
180 state
= device_state_from_string(value
);
182 log_unit_debug(u
, "Failed to parse state value: %s", value
);
184 d
->deserialized_state
= state
;
186 log_unit_debug(u
, "Unknown serialization key: %s", key
);
191 static void device_dump(Unit
*u
, FILE *f
, const char *prefix
) {
192 Device
*d
= DEVICE(u
);
197 "%sDevice State: %s\n"
198 "%sSysfs Path: %s\n",
199 prefix
, device_state_to_string(d
->state
),
200 prefix
, strna(d
->sysfs
));
203 _pure_
static UnitActiveState
device_active_state(Unit
*u
) {
206 return state_translation_table
[DEVICE(u
)->state
];
209 _pure_
static const char *device_sub_state_to_string(Unit
*u
) {
212 return device_state_to_string(DEVICE(u
)->state
);
215 static int device_update_description(Unit
*u
, struct udev_device
*dev
, const char *path
) {
223 model
= udev_device_get_property_value(dev
, "ID_MODEL_FROM_DATABASE");
225 model
= udev_device_get_property_value(dev
, "ID_MODEL");
230 /* Try to concatenate the device model string with a label, if there is one */
231 label
= udev_device_get_property_value(dev
, "ID_FS_LABEL");
233 label
= udev_device_get_property_value(dev
, "ID_PART_ENTRY_NAME");
235 label
= udev_device_get_property_value(dev
, "ID_PART_ENTRY_NUMBER");
238 _cleanup_free_
char *j
;
240 j
= strjoin(model
, " ", label
, NULL
);
242 r
= unit_set_description(u
, j
);
246 r
= unit_set_description(u
, model
);
248 r
= unit_set_description(u
, path
);
251 log_unit_error_errno(u
, r
, "Failed to set device description: %m");
256 static int device_add_udev_wants(Unit
*u
, struct udev_device
*dev
) {
258 const char *word
, *state
;
261 const char *property
;
266 property
= u
->manager
->running_as
== MANAGER_USER
? "MANAGER_USER_WANTS" : "SYSTEMD_WANTS";
267 wants
= udev_device_get_property_value(dev
, property
);
271 FOREACH_WORD_QUOTED(word
, l
, wants
, state
) {
272 _cleanup_free_
char *n
= NULL
;
278 r
= unit_name_mangle(e
, UNIT_NAME_NOGLOB
, &n
);
280 return log_unit_error_errno(u
, r
, "Failed to mangle unit name: %m");
282 r
= unit_add_dependency_by_name(u
, UNIT_WANTS
, n
, NULL
, true);
284 return log_unit_error_errno(u
, r
, "Failed to add wants dependency: %m");
287 log_unit_warning(u
, "Property %s on %s has trailing garbage, ignoring.", property
, strna(udev_device_get_syspath(dev
)));
292 static int device_setup_unit(Manager
*m
, struct udev_device
*dev
, const char *path
, bool main
) {
293 _cleanup_free_
char *e
= NULL
;
294 const char *sysfs
= NULL
;
303 sysfs
= udev_device_get_syspath(dev
);
308 r
= unit_name_from_path(path
, ".device", &e
);
310 return log_error_errno(r
, "Failed to generate unit name from device path: %m");
312 u
= manager_get_unit(m
, e
);
317 !path_equal(DEVICE(u
)->sysfs
, sysfs
)) {
318 log_unit_debug(u
, "Device %s appeared twice with different sysfs paths %s and %s", e
, DEVICE(u
)->sysfs
, sysfs
);
325 u
= unit_new(m
, sizeof(Device
));
329 r
= unit_add_name(u
, e
);
333 unit_add_to_load_queue(u
);
337 /* If this was created via some dependency and has not
338 * actually been seen yet ->sysfs will not be
339 * initialized. Hence initialize it if necessary. */
341 r
= device_set_sysfs(DEVICE(u
), sysfs
);
345 (void) device_update_description(u
, dev
, path
);
347 /* The additional systemd udev properties we only interpret
348 * for the main object */
350 (void) device_add_udev_wants(u
, dev
);
354 /* Note that this won't dispatch the load queue, the caller
355 * has to do that if needed and appropriate */
357 unit_add_to_dbus_queue(u
);
361 log_unit_warning_errno(u
, r
, "Failed to set up device unit: %m");
369 static int device_process_new(Manager
*m
, struct udev_device
*dev
) {
370 const char *sysfs
, *dn
, *alias
;
371 struct udev_list_entry
*item
= NULL
, *first
= NULL
;
376 sysfs
= udev_device_get_syspath(dev
);
380 /* Add the main unit named after the sysfs path */
381 r
= device_setup_unit(m
, dev
, sysfs
, true);
385 /* Add an additional unit for the device node */
386 dn
= udev_device_get_devnode(dev
);
388 (void) device_setup_unit(m
, dev
, dn
, false);
390 /* Add additional units for all symlinks */
391 first
= udev_device_get_devlinks_list_entry(dev
);
392 udev_list_entry_foreach(item
, first
) {
396 /* Don't bother with the /dev/block links */
397 p
= udev_list_entry_get_name(item
);
399 if (path_startswith(p
, "/dev/block/") ||
400 path_startswith(p
, "/dev/char/"))
403 /* Verify that the symlink in the FS actually belongs
404 * to this device. This is useful to deal with
405 * conflicting devices, e.g. when two disks want the
406 * same /dev/disk/by-label/xxx link because they have
407 * the same label. We want to make sure that the same
408 * device that won the symlink wins in systemd, so we
409 * check the device node major/minor */
410 if (stat(p
, &st
) >= 0)
411 if ((!S_ISBLK(st
.st_mode
) && !S_ISCHR(st
.st_mode
)) ||
412 st
.st_rdev
!= udev_device_get_devnum(dev
))
415 (void) device_setup_unit(m
, dev
, p
, false);
418 /* Add additional units for all explicitly configured
420 alias
= udev_device_get_property_value(dev
, "SYSTEMD_ALIAS");
422 const char *word
, *state
;
425 FOREACH_WORD_QUOTED(word
, l
, alias
, state
) {
431 if (path_is_absolute(e
))
432 (void) device_setup_unit(m
, dev
, e
, false);
434 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs
, e
);
437 log_warning("SYSTEMD_ALIAS for %s has trailing garbage, ignoring.", sysfs
);
443 static void device_update_found_one(Device
*d
, bool add
, DeviceFound found
, bool now
) {
444 DeviceFound n
, previous
;
448 n
= add
? (d
->found
| found
) : (d
->found
& ~found
);
458 if (d
->found
& DEVICE_FOUND_UDEV
)
459 /* When the device is known to udev we consider it
461 device_set_state(d
, DEVICE_PLUGGED
);
462 else if (d
->found
!= DEVICE_NOT_FOUND
&& (previous
& DEVICE_FOUND_UDEV
) == 0)
463 /* If the device has not been seen by udev yet, but is
464 * now referenced by the kernel, then we assume the
465 * kernel knows it now, and udev might soon too. */
466 device_set_state(d
, DEVICE_TENTATIVE
);
468 /* If nobody sees the device, or if the device was
469 * previously seen by udev and now is only referenced
470 * from the kernel, then we consider the device is
471 * gone, the kernel just hasn't noticed it yet. */
472 device_set_state(d
, DEVICE_DEAD
);
475 static int device_update_found_by_sysfs(Manager
*m
, const char *sysfs
, bool add
, DeviceFound found
, bool now
) {
481 if (found
== DEVICE_NOT_FOUND
)
484 l
= hashmap_get(m
->devices_by_sysfs
, sysfs
);
485 LIST_FOREACH(same_sysfs
, d
, l
)
486 device_update_found_one(d
, add
, found
, now
);
491 static int device_update_found_by_name(Manager
*m
, const char *path
, bool add
, DeviceFound found
, bool now
) {
492 _cleanup_free_
char *e
= NULL
;
499 if (found
== DEVICE_NOT_FOUND
)
502 r
= unit_name_from_path(path
, ".device", &e
);
504 return log_error_errno(r
, "Failed to generate unit name from device path: %m");
506 u
= manager_get_unit(m
, e
);
510 device_update_found_one(DEVICE(u
), add
, found
, now
);
514 static bool device_is_ready(struct udev_device
*dev
) {
519 ready
= udev_device_get_property_value(dev
, "SYSTEMD_READY");
523 return parse_boolean(ready
) != 0;
526 static Unit
*device_following(Unit
*u
) {
527 Device
*d
= DEVICE(u
);
528 Device
*other
, *first
= NULL
;
532 if (startswith(u
->id
, "sys-"))
535 /* Make everybody follow the unit that's named after the sysfs path */
536 for (other
= d
->same_sysfs_next
; other
; other
= other
->same_sysfs_next
)
537 if (startswith(UNIT(other
)->id
, "sys-"))
540 for (other
= d
->same_sysfs_prev
; other
; other
= other
->same_sysfs_prev
) {
541 if (startswith(UNIT(other
)->id
, "sys-"))
550 static int device_following_set(Unit
*u
, Set
**_set
) {
551 Device
*d
= DEVICE(u
), *other
;
558 if (LIST_JUST_US(same_sysfs
, d
)) {
567 LIST_FOREACH_AFTER(same_sysfs
, other
, d
) {
568 r
= set_put(set
, other
);
573 LIST_FOREACH_BEFORE(same_sysfs
, other
, d
) {
574 r
= set_put(set
, other
);
587 static void device_shutdown(Manager
*m
) {
590 m
->udev_event_source
= sd_event_source_unref(m
->udev_event_source
);
592 if (m
->udev_monitor
) {
593 udev_monitor_unref(m
->udev_monitor
);
594 m
->udev_monitor
= NULL
;
597 hashmap_free(m
->devices_by_sysfs
);
598 m
->devices_by_sysfs
= NULL
;
601 static int device_enumerate(Manager
*m
) {
602 _cleanup_udev_enumerate_unref_
struct udev_enumerate
*e
= NULL
;
603 struct udev_list_entry
*item
= NULL
, *first
= NULL
;
608 if (!m
->udev_monitor
) {
609 m
->udev_monitor
= udev_monitor_new_from_netlink(m
->udev
, "udev");
610 if (!m
->udev_monitor
) {
615 /* This will fail if we are unprivileged, but that
616 * should not matter much, as user instances won't run
618 (void) udev_monitor_set_receive_buffer_size(m
->udev_monitor
, 128*1024*1024);
620 r
= udev_monitor_filter_add_match_tag(m
->udev_monitor
, "systemd");
624 r
= udev_monitor_enable_receiving(m
->udev_monitor
);
628 r
= sd_event_add_io(m
->event
, &m
->udev_event_source
, udev_monitor_get_fd(m
->udev_monitor
), EPOLLIN
, device_dispatch_io
, m
);
632 (void) sd_event_source_set_description(m
->udev_event_source
, "device");
635 e
= udev_enumerate_new(m
->udev
);
641 r
= udev_enumerate_add_match_tag(e
, "systemd");
645 r
= udev_enumerate_add_match_is_initialized(e
);
649 r
= udev_enumerate_scan_devices(e
);
653 first
= udev_enumerate_get_list_entry(e
);
654 udev_list_entry_foreach(item
, first
) {
655 _cleanup_udev_device_unref_
struct udev_device
*dev
= NULL
;
658 sysfs
= udev_list_entry_get_name(item
);
660 dev
= udev_device_new_from_syspath(m
->udev
, sysfs
);
666 if (!device_is_ready(dev
))
669 (void) device_process_new(m
, dev
);
671 device_update_found_by_sysfs(m
, sysfs
, true, DEVICE_FOUND_UDEV
, false);
677 log_error_errno(r
, "Failed to enumerate devices: %m");
683 static int device_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
684 _cleanup_udev_device_unref_
struct udev_device
*dev
= NULL
;
685 Manager
*m
= userdata
;
686 const char *action
, *sysfs
;
691 if (revents
!= EPOLLIN
) {
692 static RATELIMIT_DEFINE(limit
, 10*USEC_PER_SEC
, 5);
694 if (!ratelimit_test(&limit
))
695 log_error_errno(errno
, "Failed to get udev event: %m");
696 if (!(revents
& EPOLLIN
))
701 * libudev might filter-out devices which pass the bloom
702 * filter, so getting NULL here is not necessarily an error.
704 dev
= udev_monitor_receive_device(m
->udev_monitor
);
708 sysfs
= udev_device_get_syspath(dev
);
710 log_error("Failed to get udev sys path.");
714 action
= udev_device_get_action(dev
);
716 log_error("Failed to get udev action string.");
720 if (streq(action
, "remove")) {
721 r
= swap_process_device_remove(m
, dev
);
723 log_error_errno(r
, "Failed to process swap device remove event: %m");
725 /* If we get notified that a device was removed by
726 * udev, then it's completely gone, hence unset all
728 device_update_found_by_sysfs(m
, sysfs
, false, DEVICE_FOUND_UDEV
|DEVICE_FOUND_MOUNT
|DEVICE_FOUND_SWAP
, true);
730 } else if (device_is_ready(dev
)) {
732 (void) device_process_new(m
, dev
);
734 r
= swap_process_device_new(m
, dev
);
736 log_error_errno(r
, "Failed to process swap device new event: %m");
738 manager_dispatch_load_queue(m
);
740 /* The device is found now, set the udev found bit */
741 device_update_found_by_sysfs(m
, sysfs
, true, DEVICE_FOUND_UDEV
, true);
744 /* The device is nominally around, but not ready for
745 * us. Hence unset the udev bit, but leave the rest
748 device_update_found_by_sysfs(m
, sysfs
, false, DEVICE_FOUND_UDEV
, true);
754 static bool device_supported(void) {
755 static int read_only
= -1;
757 /* If /sys is read-only we don't support device units, and any
758 * attempts to start one should fail immediately. */
761 read_only
= path_is_read_only_fs("/sys");
763 return read_only
<= 0;
766 int device_found_node(Manager
*m
, const char *node
, bool add
, DeviceFound found
, bool now
) {
767 _cleanup_udev_device_unref_
struct udev_device
*dev
= NULL
;
773 if (!device_supported())
776 /* This is called whenever we find a device referenced in
777 * /proc/swaps or /proc/self/mounts. Such a device might be
778 * mounted/enabled at a time where udev has not finished
779 * probing it yet, and we thus haven't learned about it
780 * yet. In this case we will set the device unit to
781 * "tentative" state. */
784 if (!path_startswith(node
, "/dev"))
787 /* We make an extra check here, if the device node
788 * actually exists. If it's missing, then this is an
789 * indication that device was unplugged but is still
790 * referenced in /proc/swaps or
791 * /proc/self/mountinfo. Note that this check doesn't
792 * really cover all cases where a device might be gone
793 * away, since drives that can have a medium inserted
794 * will still have a device node even when the medium
797 if (stat(node
, &st
) >= 0) {
798 if (!S_ISBLK(st
.st_mode
) && !S_ISCHR(st
.st_mode
))
801 dev
= udev_device_new_from_devnum(m
->udev
, S_ISBLK(st
.st_mode
) ? 'b' : 'c', st
.st_rdev
);
802 if (!dev
&& errno
!= ENOENT
)
803 return log_error_errno(errno
, "Failed to get udev device from devnum %u:%u: %m", major(st
.st_rdev
), minor(st
.st_rdev
));
805 } else if (errno
!= ENOENT
)
806 return log_error_errno(errno
, "Failed to stat device node file %s: %m", node
);
808 /* If the device is known in the kernel and newly
809 * appeared, then we'll create a device unit for it,
810 * under the name referenced in /proc/swaps or
811 * /proc/self/mountinfo. */
813 (void) device_setup_unit(m
, dev
, node
, false);
816 /* Update the device unit's state, should it exist */
817 return device_update_found_by_name(m
, node
, add
, found
, now
);
820 static const char* const device_state_table
[_DEVICE_STATE_MAX
] = {
821 [DEVICE_DEAD
] = "dead",
822 [DEVICE_TENTATIVE
] = "tentative",
823 [DEVICE_PLUGGED
] = "plugged",
826 DEFINE_STRING_TABLE_LOOKUP(device_state
, DeviceState
);
828 const UnitVTable device_vtable
= {
829 .object_size
= sizeof(Device
),
835 .no_instances
= true,
839 .load
= unit_load_fragment_and_dropin_optional
,
841 .coldplug
= device_coldplug
,
843 .serialize
= device_serialize
,
844 .deserialize_item
= device_deserialize_item
,
848 .active_state
= device_active_state
,
849 .sub_state_to_string
= device_sub_state_to_string
,
851 .bus_vtable
= bus_device_vtable
,
853 .following
= device_following
,
854 .following_set
= device_following_set
,
856 .enumerate
= device_enumerate
,
857 .shutdown
= device_shutdown
,
858 .supported
= device_supported
,
860 .status_message_formats
= {
861 .starting_stopping
= {
862 [0] = "Expecting device %s...",
864 .finished_start_job
= {
865 [JOB_DONE
] = "Found device %s.",
866 [JOB_TIMEOUT
] = "Timed out waiting for device %s.",