]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/device.c
core/device: remove unnecessary check (#8661)
[thirdparty/systemd.git] / src / core / device.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3 This file is part of systemd.
4
5 Copyright 2010 Lennart Poettering
6
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
11
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
19 ***/
20
21 #include <errno.h>
22 #include <sys/epoll.h>
23
24 #include "libudev.h"
25
26 #include "alloc-util.h"
27 #include "dbus-device.h"
28 #include "device.h"
29 #include "log.h"
30 #include "parse-util.h"
31 #include "path-util.h"
32 #include "stat-util.h"
33 #include "string-util.h"
34 #include "swap.h"
35 #include "udev-util.h"
36 #include "unit-name.h"
37 #include "unit.h"
38
39 static const UnitActiveState state_translation_table[_DEVICE_STATE_MAX] = {
40 [DEVICE_DEAD] = UNIT_INACTIVE,
41 [DEVICE_TENTATIVE] = UNIT_ACTIVATING,
42 [DEVICE_PLUGGED] = UNIT_ACTIVE,
43 };
44
45 static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
46
47 static void device_unset_sysfs(Device *d) {
48 Hashmap *devices;
49 Device *first;
50
51 assert(d);
52
53 if (!d->sysfs)
54 return;
55
56 /* Remove this unit from the chain of devices which share the
57 * same sysfs path. */
58 devices = UNIT(d)->manager->devices_by_sysfs;
59 first = hashmap_get(devices, d->sysfs);
60 LIST_REMOVE(same_sysfs, first, d);
61
62 if (first)
63 hashmap_remove_and_replace(devices, d->sysfs, first->sysfs, first);
64 else
65 hashmap_remove(devices, d->sysfs);
66
67 d->sysfs = mfree(d->sysfs);
68 }
69
70 static int device_set_sysfs(Device *d, const char *sysfs) {
71 Device *first;
72 char *copy;
73 int r;
74
75 assert(d);
76
77 if (streq_ptr(d->sysfs, sysfs))
78 return 0;
79
80 r = hashmap_ensure_allocated(&UNIT(d)->manager->devices_by_sysfs, &path_hash_ops);
81 if (r < 0)
82 return r;
83
84 copy = strdup(sysfs);
85 if (!copy)
86 return -ENOMEM;
87
88 device_unset_sysfs(d);
89
90 first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, sysfs);
91 LIST_PREPEND(same_sysfs, first, d);
92
93 r = hashmap_replace(UNIT(d)->manager->devices_by_sysfs, copy, first);
94 if (r < 0) {
95 LIST_REMOVE(same_sysfs, first, d);
96 free(copy);
97 return r;
98 }
99
100 d->sysfs = copy;
101
102 return 0;
103 }
104
105 static void device_init(Unit *u) {
106 Device *d = DEVICE(u);
107
108 assert(d);
109 assert(UNIT(d)->load_state == UNIT_STUB);
110
111 /* In contrast to all other unit types we timeout jobs waiting
112 * for devices by default. This is because they otherwise wait
113 * indefinitely for plugged in devices, something which cannot
114 * happen for the other units since their operations time out
115 * anyway. */
116 u->job_running_timeout = u->manager->default_timeout_start_usec;
117
118 u->ignore_on_isolate = true;
119 }
120
121 static void device_done(Unit *u) {
122 Device *d = DEVICE(u);
123
124 assert(d);
125
126 device_unset_sysfs(d);
127 }
128
129 static void device_set_state(Device *d, DeviceState state) {
130 DeviceState old_state;
131 assert(d);
132
133 old_state = d->state;
134 d->state = state;
135
136 if (state != old_state)
137 log_unit_debug(UNIT(d), "Changed %s -> %s", device_state_to_string(old_state), device_state_to_string(state));
138
139 unit_notify(UNIT(d), state_translation_table[old_state], state_translation_table[state], true);
140 }
141
142 static int device_coldplug(Unit *u) {
143 Device *d = DEVICE(u);
144
145 assert(d);
146 assert(d->state == DEVICE_DEAD);
147
148 if (d->found & DEVICE_FOUND_UDEV)
149 /* If udev says the device is around, it's around */
150 device_set_state(d, DEVICE_PLUGGED);
151 else if (d->found != DEVICE_NOT_FOUND && d->deserialized_state != DEVICE_PLUGGED)
152 /* If a device is found in /proc/self/mountinfo or
153 * /proc/swaps, and was not yet announced via udev,
154 * it's "tentatively" around. */
155 device_set_state(d, DEVICE_TENTATIVE);
156
157 return 0;
158 }
159
160 static int device_serialize(Unit *u, FILE *f, FDSet *fds) {
161 Device *d = DEVICE(u);
162
163 assert(u);
164 assert(f);
165 assert(fds);
166
167 unit_serialize_item(u, f, "state", device_state_to_string(d->state));
168
169 return 0;
170 }
171
172 static int device_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
173 Device *d = DEVICE(u);
174
175 assert(u);
176 assert(key);
177 assert(value);
178 assert(fds);
179
180 if (streq(key, "state")) {
181 DeviceState state;
182
183 state = device_state_from_string(value);
184 if (state < 0)
185 log_unit_debug(u, "Failed to parse state value: %s", value);
186 else
187 d->deserialized_state = state;
188 } else
189 log_unit_debug(u, "Unknown serialization key: %s", key);
190
191 return 0;
192 }
193
194 static void device_dump(Unit *u, FILE *f, const char *prefix) {
195 Device *d = DEVICE(u);
196
197 assert(d);
198
199 fprintf(f,
200 "%sDevice State: %s\n"
201 "%sSysfs Path: %s\n",
202 prefix, device_state_to_string(d->state),
203 prefix, strna(d->sysfs));
204 }
205
206 _pure_ static UnitActiveState device_active_state(Unit *u) {
207 assert(u);
208
209 return state_translation_table[DEVICE(u)->state];
210 }
211
212 _pure_ static const char *device_sub_state_to_string(Unit *u) {
213 assert(u);
214
215 return device_state_to_string(DEVICE(u)->state);
216 }
217
218 static int device_update_description(Unit *u, struct udev_device *dev, const char *path) {
219 const char *model;
220 int r;
221
222 assert(u);
223 assert(dev);
224 assert(path);
225
226 model = udev_device_get_property_value(dev, "ID_MODEL_FROM_DATABASE");
227 if (!model)
228 model = udev_device_get_property_value(dev, "ID_MODEL");
229
230 if (model) {
231 const char *label;
232
233 /* Try to concatenate the device model string with a label, if there is one */
234 label = udev_device_get_property_value(dev, "ID_FS_LABEL");
235 if (!label)
236 label = udev_device_get_property_value(dev, "ID_PART_ENTRY_NAME");
237 if (!label)
238 label = udev_device_get_property_value(dev, "ID_PART_ENTRY_NUMBER");
239
240 if (label) {
241 _cleanup_free_ char *j;
242
243 j = strjoin(model, " ", label);
244 if (j)
245 r = unit_set_description(u, j);
246 else
247 r = -ENOMEM;
248 } else
249 r = unit_set_description(u, model);
250 } else
251 r = unit_set_description(u, path);
252
253 if (r < 0)
254 log_unit_error_errno(u, r, "Failed to set device description: %m");
255
256 return r;
257 }
258
259 static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
260 const char *wants, *property;
261 int r;
262
263 assert(u);
264 assert(dev);
265
266 property = MANAGER_IS_USER(u->manager) ? "SYSTEMD_USER_WANTS" : "SYSTEMD_WANTS";
267
268 wants = udev_device_get_property_value(dev, property);
269 if (!wants)
270 return 0;
271
272 for (;;) {
273 _cleanup_free_ char *word = NULL, *k = NULL;
274
275 r = extract_first_word(&wants, &word, NULL, EXTRACT_QUOTES);
276 if (r == 0)
277 return 0;
278 if (r == -ENOMEM)
279 return log_oom();
280 if (r < 0)
281 return log_unit_error_errno(u, r, "Failed to parse property %s with value %s: %m", property, wants);
282
283 if (unit_name_is_valid(word, UNIT_NAME_TEMPLATE) && DEVICE(u)->sysfs) {
284 _cleanup_free_ char *escaped = NULL;
285
286 /* If the unit name is specified as template, then automatically fill in the sysfs path of the
287 * device as instance name, properly escaped. */
288
289 r = unit_name_path_escape(DEVICE(u)->sysfs, &escaped);
290 if (r < 0)
291 return log_unit_error_errno(u, r, "Failed to escape %s: %m", DEVICE(u)->sysfs);
292
293 r = unit_name_replace_instance(word, escaped, &k);
294 if (r < 0)
295 return log_unit_error_errno(u, r, "Failed to build %s instance of template %s: %m", escaped, word);
296 } else {
297 /* If this is not a template, then let's mangle it so, that it becomes a valid unit name. */
298
299 r = unit_name_mangle(word, UNIT_NAME_MANGLE_WARN, &k);
300 if (r < 0)
301 return log_unit_error_errno(u, r, "Failed to mangle unit name \"%s\": %m", word);
302 }
303
304 r = unit_add_dependency_by_name(u, UNIT_WANTS, k, NULL, true, UNIT_DEPENDENCY_UDEV);
305 if (r < 0)
306 return log_unit_error_errno(u, r, "Failed to add Wants= dependency: %m");
307 }
308 }
309
310 static bool device_is_bound_by_mounts(Device *d, struct udev_device *dev) {
311 const char *bound_by;
312 int r;
313
314 assert(d);
315 assert(dev);
316
317 bound_by = udev_device_get_property_value(dev, "SYSTEMD_MOUNT_DEVICE_BOUND");
318 if (bound_by) {
319 r = parse_boolean(bound_by);
320 if (r < 0)
321 log_warning_errno(r, "Failed to parse SYSTEMD_MOUNT_DEVICE_BOUND='%s' udev property of %s, ignoring: %m", bound_by, strna(d->sysfs));
322
323 d->bind_mounts = r > 0;
324 } else
325 d->bind_mounts = false;
326
327 return d->bind_mounts;
328 }
329
330 static int device_upgrade_mount_deps(Unit *u) {
331 Unit *other;
332 Iterator i;
333 void *v;
334 int r;
335
336 /* Let's upgrade Requires= to BindsTo= on us. (Used when SYSTEMD_MOUNT_DEVICE_BOUND is set) */
337
338 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REQUIRED_BY], i) {
339 if (other->type != UNIT_MOUNT)
340 continue;
341
342 r = unit_add_dependency(other, UNIT_BINDS_TO, u, true, UNIT_DEPENDENCY_UDEV);
343 if (r < 0)
344 return r;
345 }
346 return 0;
347 }
348
349 static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
350 _cleanup_free_ char *e = NULL;
351 const char *sysfs = NULL;
352 Unit *u = NULL;
353 bool delete;
354 int r;
355
356 assert(m);
357 assert(path);
358
359 if (dev) {
360 sysfs = udev_device_get_syspath(dev);
361 if (!sysfs)
362 return 0;
363 }
364
365 r = unit_name_from_path(path, ".device", &e);
366 if (r < 0)
367 return log_error_errno(r, "Failed to generate unit name from device path: %m");
368
369 u = manager_get_unit(m, e);
370 if (u) {
371 /* The device unit can still be present even if the device was unplugged: a mount unit can reference it hence
372 * preventing the GC to have garbaged it. That's desired since the device unit may have a dependency on the
373 * mount unit which was added during the loading of the later. */
374 if (dev && DEVICE(u)->state == DEVICE_PLUGGED) {
375
376 /* This unit is in plugged state: we're sure it's attached to a device. */
377 if (!path_equal(DEVICE(u)->sysfs, sysfs)) {
378 log_unit_debug(u, "Dev %s appeared twice with different sysfs paths %s and %s",
379 e, DEVICE(u)->sysfs, sysfs);
380 return -EEXIST;
381 }
382 }
383
384 delete = false;
385
386 /* Let's remove all dependencies generated due to udev properties. We'll readd whatever is configured
387 * now below. */
388 unit_remove_dependencies(u, UNIT_DEPENDENCY_UDEV);
389 } else {
390 delete = true;
391
392 r = unit_new_for_name(m, sizeof(Device), e, &u);
393 if (r < 0)
394 goto fail;
395
396 unit_add_to_load_queue(u);
397 }
398
399 /* If this was created via some dependency and has not
400 * actually been seen yet ->sysfs will not be
401 * initialized. Hence initialize it if necessary. */
402 if (sysfs) {
403 r = device_set_sysfs(DEVICE(u), sysfs);
404 if (r < 0)
405 goto fail;
406
407 (void) device_update_description(u, dev, path);
408
409 /* The additional systemd udev properties we only interpret
410 * for the main object */
411 if (main)
412 (void) device_add_udev_wants(u, dev);
413 }
414
415 /* So the user wants the mount units to be bound to the device but a mount unit might has been seen by systemd
416 * before the device appears on its radar. In this case the device unit is partially initialized and includes
417 * the deps on the mount unit but at that time the "bind mounts" flag wasn't not present. Fix this up now. */
418 if (dev && device_is_bound_by_mounts(DEVICE(u), dev))
419 device_upgrade_mount_deps(u);
420
421 /* Note that this won't dispatch the load queue, the caller has to do that if needed and appropriate */
422
423 unit_add_to_dbus_queue(u);
424 return 0;
425
426 fail:
427 log_unit_warning_errno(u, r, "Failed to set up device unit: %m");
428
429 if (delete)
430 unit_free(u);
431
432 return r;
433 }
434
435 static int device_process_new(Manager *m, struct udev_device *dev) {
436 const char *sysfs, *dn, *alias;
437 struct udev_list_entry *item = NULL, *first = NULL;
438 int r;
439
440 assert(m);
441
442 sysfs = udev_device_get_syspath(dev);
443 if (!sysfs)
444 return 0;
445
446 /* Add the main unit named after the sysfs path */
447 r = device_setup_unit(m, dev, sysfs, true);
448 if (r < 0)
449 return r;
450
451 /* Add an additional unit for the device node */
452 dn = udev_device_get_devnode(dev);
453 if (dn)
454 (void) device_setup_unit(m, dev, dn, false);
455
456 /* Add additional units for all symlinks */
457 first = udev_device_get_devlinks_list_entry(dev);
458 udev_list_entry_foreach(item, first) {
459 const char *p;
460 struct stat st;
461
462 /* Don't bother with the /dev/block links */
463 p = udev_list_entry_get_name(item);
464
465 if (path_startswith(p, "/dev/block/") ||
466 path_startswith(p, "/dev/char/"))
467 continue;
468
469 /* Verify that the symlink in the FS actually belongs
470 * to this device. This is useful to deal with
471 * conflicting devices, e.g. when two disks want the
472 * same /dev/disk/by-label/xxx link because they have
473 * the same label. We want to make sure that the same
474 * device that won the symlink wins in systemd, so we
475 * check the device node major/minor */
476 if (stat(p, &st) >= 0)
477 if ((!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode)) ||
478 st.st_rdev != udev_device_get_devnum(dev))
479 continue;
480
481 (void) device_setup_unit(m, dev, p, false);
482 }
483
484 /* Add additional units for all explicitly configured
485 * aliases */
486 alias = udev_device_get_property_value(dev, "SYSTEMD_ALIAS");
487 for (;;) {
488 _cleanup_free_ char *word = NULL;
489
490 r = extract_first_word(&alias, &word, NULL, EXTRACT_QUOTES);
491 if (r == 0)
492 return 0;
493 if (r == -ENOMEM)
494 return log_oom();
495 if (r < 0)
496 return log_warning_errno(r, "Failed to add parse SYSTEMD_ALIAS for %s: %m", sysfs);
497
498 if (path_is_absolute(word))
499 (void) device_setup_unit(m, dev, word, false);
500 else
501 log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, word);
502 }
503 }
504
505 static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
506 DeviceFound n, previous;
507
508 assert(d);
509
510 n = add ? (d->found | found) : (d->found & ~found);
511 if (n == d->found)
512 return;
513
514 previous = d->found;
515 d->found = n;
516
517 if (!now)
518 return;
519
520 /* Didn't exist before, but does now? if so, generate a new invocation ID for it */
521 if (previous == DEVICE_NOT_FOUND && d->found != DEVICE_NOT_FOUND)
522 (void) unit_acquire_invocation_id(UNIT(d));
523
524 if (d->found & DEVICE_FOUND_UDEV)
525 /* When the device is known to udev we consider it
526 * plugged. */
527 device_set_state(d, DEVICE_PLUGGED);
528 else if (d->found != DEVICE_NOT_FOUND && (previous & DEVICE_FOUND_UDEV) == 0)
529 /* If the device has not been seen by udev yet, but is
530 * now referenced by the kernel, then we assume the
531 * kernel knows it now, and udev might soon too. */
532 device_set_state(d, DEVICE_TENTATIVE);
533 else {
534 /* If nobody sees the device, or if the device was
535 * previously seen by udev and now is only referenced
536 * from the kernel, then we consider the device is
537 * gone, the kernel just hasn't noticed it yet. */
538
539 device_set_state(d, DEVICE_DEAD);
540 device_unset_sysfs(d);
541 }
542
543 }
544
545 static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
546 Device *d, *l, *n;
547
548 assert(m);
549 assert(sysfs);
550
551 if (found == DEVICE_NOT_FOUND)
552 return 0;
553
554 l = hashmap_get(m->devices_by_sysfs, sysfs);
555 LIST_FOREACH_SAFE(same_sysfs, d, n, l)
556 device_update_found_one(d, add, found, now);
557
558 return 0;
559 }
560
561 static int device_update_found_by_name(Manager *m, const char *path, bool add, DeviceFound found, bool now) {
562 _cleanup_free_ char *e = NULL;
563 Unit *u;
564 int r;
565
566 assert(m);
567 assert(path);
568
569 if (found == DEVICE_NOT_FOUND)
570 return 0;
571
572 r = unit_name_from_path(path, ".device", &e);
573 if (r < 0)
574 return log_error_errno(r, "Failed to generate unit name from device path: %m");
575
576 u = manager_get_unit(m, e);
577 if (!u)
578 return 0;
579
580 device_update_found_one(DEVICE(u), add, found, now);
581 return 0;
582 }
583
584 static bool device_is_ready(struct udev_device *dev) {
585 const char *ready;
586
587 assert(dev);
588
589 ready = udev_device_get_property_value(dev, "SYSTEMD_READY");
590 if (!ready)
591 return true;
592
593 return parse_boolean(ready) != 0;
594 }
595
596 static Unit *device_following(Unit *u) {
597 Device *d = DEVICE(u);
598 Device *other, *first = NULL;
599
600 assert(d);
601
602 if (startswith(u->id, "sys-"))
603 return NULL;
604
605 /* Make everybody follow the unit that's named after the sysfs path */
606 for (other = d->same_sysfs_next; other; other = other->same_sysfs_next)
607 if (startswith(UNIT(other)->id, "sys-"))
608 return UNIT(other);
609
610 for (other = d->same_sysfs_prev; other; other = other->same_sysfs_prev) {
611 if (startswith(UNIT(other)->id, "sys-"))
612 return UNIT(other);
613
614 first = other;
615 }
616
617 return UNIT(first);
618 }
619
620 static int device_following_set(Unit *u, Set **_set) {
621 Device *d = DEVICE(u), *other;
622 Set *set;
623 int r;
624
625 assert(d);
626 assert(_set);
627
628 if (LIST_JUST_US(same_sysfs, d)) {
629 *_set = NULL;
630 return 0;
631 }
632
633 set = set_new(NULL);
634 if (!set)
635 return -ENOMEM;
636
637 LIST_FOREACH_AFTER(same_sysfs, other, d) {
638 r = set_put(set, other);
639 if (r < 0)
640 goto fail;
641 }
642
643 LIST_FOREACH_BEFORE(same_sysfs, other, d) {
644 r = set_put(set, other);
645 if (r < 0)
646 goto fail;
647 }
648
649 *_set = set;
650 return 1;
651
652 fail:
653 set_free(set);
654 return r;
655 }
656
657 static void device_shutdown(Manager *m) {
658 assert(m);
659
660 m->udev_event_source = sd_event_source_unref(m->udev_event_source);
661 m->udev_monitor = udev_monitor_unref(m->udev_monitor);
662 m->devices_by_sysfs = hashmap_free(m->devices_by_sysfs);
663 }
664
665 static void device_enumerate(Manager *m) {
666 _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
667 struct udev_list_entry *item = NULL, *first = NULL;
668 int r;
669
670 assert(m);
671
672 if (!m->udev_monitor) {
673 m->udev_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
674 if (!m->udev_monitor) {
675 log_oom();
676 goto fail;
677 }
678
679 /* This will fail if we are unprivileged, but that
680 * should not matter much, as user instances won't run
681 * during boot. */
682 (void) udev_monitor_set_receive_buffer_size(m->udev_monitor, 128*1024*1024);
683
684 r = udev_monitor_filter_add_match_tag(m->udev_monitor, "systemd");
685 if (r < 0) {
686 log_error_errno(r, "Failed to add udev tag match: %m");
687 goto fail;
688 }
689
690 r = udev_monitor_enable_receiving(m->udev_monitor);
691 if (r < 0) {
692 log_error_errno(r, "Failed to enable udev event reception: %m");
693 goto fail;
694 }
695
696 r = sd_event_add_io(m->event, &m->udev_event_source, udev_monitor_get_fd(m->udev_monitor), EPOLLIN, device_dispatch_io, m);
697 if (r < 0) {
698 log_error_errno(r, "Failed to watch udev file descriptor: %m");
699 goto fail;
700 }
701
702 (void) sd_event_source_set_description(m->udev_event_source, "device");
703 }
704
705 e = udev_enumerate_new(m->udev);
706 if (!e) {
707 log_oom();
708 goto fail;
709 }
710
711 r = udev_enumerate_add_match_tag(e, "systemd");
712 if (r < 0) {
713 log_error_errno(r, "Failed to create udev tag enumeration: %m");
714 goto fail;
715 }
716
717 r = udev_enumerate_add_match_is_initialized(e);
718 if (r < 0) {
719 log_error_errno(r, "Failed to install initialization match into enumeration: %m");
720 goto fail;
721 }
722
723 r = udev_enumerate_scan_devices(e);
724 if (r < 0) {
725 log_error_errno(r, "Failed to enumerate devices: %m");
726 goto fail;
727 }
728
729 first = udev_enumerate_get_list_entry(e);
730 udev_list_entry_foreach(item, first) {
731 _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
732 const char *sysfs;
733
734 sysfs = udev_list_entry_get_name(item);
735
736 dev = udev_device_new_from_syspath(m->udev, sysfs);
737 if (!dev) {
738 log_oom();
739 continue;
740 }
741
742 if (!device_is_ready(dev))
743 continue;
744
745 (void) device_process_new(m, dev);
746
747 device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, false);
748 }
749
750 return;
751
752 fail:
753 device_shutdown(m);
754 }
755
756 static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
757 _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
758 Manager *m = userdata;
759 const char *action, *sysfs;
760 int r;
761
762 assert(m);
763
764 if (revents != EPOLLIN) {
765 static RATELIMIT_DEFINE(limit, 10*USEC_PER_SEC, 5);
766
767 if (!ratelimit_test(&limit))
768 log_error_errno(errno, "Failed to get udev event: %m");
769 if (!(revents & EPOLLIN))
770 return 0;
771 }
772
773 /*
774 * libudev might filter-out devices which pass the bloom
775 * filter, so getting NULL here is not necessarily an error.
776 */
777 dev = udev_monitor_receive_device(m->udev_monitor);
778 if (!dev)
779 return 0;
780
781 sysfs = udev_device_get_syspath(dev);
782 if (!sysfs) {
783 log_error("Failed to get udev sys path.");
784 return 0;
785 }
786
787 action = udev_device_get_action(dev);
788 if (!action) {
789 log_error("Failed to get udev action string.");
790 return 0;
791 }
792
793 if (streq(action, "change")) {
794 Unit *u;
795 Device *d, *l, *n;
796
797 l = hashmap_get(m->devices_by_sysfs, sysfs);
798 LIST_FOREACH_SAFE(same_sysfs, d, n, l) {
799 u = &d->meta;
800 if (u && UNIT_VTABLE(u)->active_state(u) == UNIT_ACTIVE) {
801 r = manager_propagate_reload(m, u, JOB_REPLACE, NULL);
802 if (r < 0)
803 log_error_errno(r, "Failed to propagate reload: %m");
804 }
805 }
806 }
807
808 /* A change event can signal that a device is becoming ready, in particular if
809 * the device is using the SYSTEMD_READY logic in udev
810 * so we need to reach the else block of the follwing if, even for change events */
811 if (streq(action, "remove")) {
812 r = swap_process_device_remove(m, dev);
813 if (r < 0)
814 log_error_errno(r, "Failed to process swap device remove event: %m");
815
816 /* If we get notified that a device was removed by
817 * udev, then it's completely gone, hence unset all
818 * found bits */
819 device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV|DEVICE_FOUND_MOUNT|DEVICE_FOUND_SWAP, true);
820
821 } else if (device_is_ready(dev)) {
822
823 (void) device_process_new(m, dev);
824
825 r = swap_process_device_new(m, dev);
826 if (r < 0)
827 log_error_errno(r, "Failed to process swap device new event: %m");
828
829 manager_dispatch_load_queue(m);
830
831 /* The device is found now, set the udev found bit */
832 device_update_found_by_sysfs(m, sysfs, true, DEVICE_FOUND_UDEV, true);
833
834 } else {
835 /* The device is nominally around, but not ready for
836 * us. Hence unset the udev bit, but leave the rest
837 * around. */
838
839 device_update_found_by_sysfs(m, sysfs, false, DEVICE_FOUND_UDEV, true);
840 }
841
842 return 0;
843 }
844
845 static bool device_supported(void) {
846 static int read_only = -1;
847
848 /* If /sys is read-only we don't support device units, and any
849 * attempts to start one should fail immediately. */
850
851 if (read_only < 0)
852 read_only = path_is_read_only_fs("/sys");
853
854 return read_only <= 0;
855 }
856
857 int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now) {
858 _cleanup_udev_device_unref_ struct udev_device *dev = NULL;
859 struct stat st;
860
861 assert(m);
862 assert(node);
863
864 if (!device_supported())
865 return 0;
866
867 /* This is called whenever we find a device referenced in
868 * /proc/swaps or /proc/self/mounts. Such a device might be
869 * mounted/enabled at a time where udev has not finished
870 * probing it yet, and we thus haven't learned about it
871 * yet. In this case we will set the device unit to
872 * "tentative" state. */
873
874 if (add) {
875 if (!path_startswith(node, "/dev"))
876 return 0;
877
878 /* We make an extra check here, if the device node
879 * actually exists. If it's missing, then this is an
880 * indication that device was unplugged but is still
881 * referenced in /proc/swaps or
882 * /proc/self/mountinfo. Note that this check doesn't
883 * really cover all cases where a device might be gone
884 * away, since drives that can have a medium inserted
885 * will still have a device node even when the medium
886 * is not there... */
887
888 if (stat(node, &st) >= 0) {
889 if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
890 return 0;
891
892 dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
893 if (!dev && errno != ENOENT)
894 return log_error_errno(errno, "Failed to get udev device from devnum %u:%u: %m", major(st.st_rdev), minor(st.st_rdev));
895
896 } else if (errno != ENOENT)
897 return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
898
899 /* If the device is known in the kernel and newly
900 * appeared, then we'll create a device unit for it,
901 * under the name referenced in /proc/swaps or
902 * /proc/self/mountinfo. */
903
904 (void) device_setup_unit(m, dev, node, false);
905 }
906
907 /* Update the device unit's state, should it exist */
908 return device_update_found_by_name(m, node, add, found, now);
909 }
910
911 bool device_shall_be_bound_by(Unit *device, Unit *u) {
912
913 if (u->type != UNIT_MOUNT)
914 return false;
915
916 return DEVICE(device)->bind_mounts;
917 }
918
919 const UnitVTable device_vtable = {
920 .object_size = sizeof(Device),
921 .sections =
922 "Unit\0"
923 "Device\0"
924 "Install\0",
925
926 .gc_jobs = true,
927
928 .init = device_init,
929 .done = device_done,
930 .load = unit_load_fragment_and_dropin_optional,
931
932 .coldplug = device_coldplug,
933
934 .serialize = device_serialize,
935 .deserialize_item = device_deserialize_item,
936
937 .dump = device_dump,
938
939 .active_state = device_active_state,
940 .sub_state_to_string = device_sub_state_to_string,
941
942 .bus_vtable = bus_device_vtable,
943
944 .following = device_following,
945 .following_set = device_following_set,
946
947 .enumerate = device_enumerate,
948 .shutdown = device_shutdown,
949 .supported = device_supported,
950
951 .status_message_formats = {
952 .starting_stopping = {
953 [0] = "Expecting device %s...",
954 },
955 .finished_start_job = {
956 [JOB_DONE] = "Found device %s.",
957 [JOB_TIMEOUT] = "Timed out waiting for device %s.",
958 },
959 },
960 };