]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/mount.c
relicense to LGPLv2.1 (with exceptions)
[thirdparty/systemd.git] / src / core / mount.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
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.
12
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.
17
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/>.
20 ***/
21
22 #include <errno.h>
23 #include <stdio.h>
24 #include <mntent.h>
25 #include <sys/epoll.h>
26 #include <signal.h>
27
28 #include "unit.h"
29 #include "mount.h"
30 #include "load-fragment.h"
31 #include "load-dropin.h"
32 #include "log.h"
33 #include "strv.h"
34 #include "mkdir.h"
35 #include "mount-setup.h"
36 #include "unit-name.h"
37 #include "dbus-mount.h"
38 #include "special.h"
39 #include "bus-errors.h"
40 #include "exit-status.h"
41 #include "def.h"
42
43 static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = {
44 [MOUNT_DEAD] = UNIT_INACTIVE,
45 [MOUNT_MOUNTING] = UNIT_ACTIVATING,
46 [MOUNT_MOUNTING_DONE] = UNIT_ACTIVE,
47 [MOUNT_MOUNTED] = UNIT_ACTIVE,
48 [MOUNT_REMOUNTING] = UNIT_RELOADING,
49 [MOUNT_UNMOUNTING] = UNIT_DEACTIVATING,
50 [MOUNT_MOUNTING_SIGTERM] = UNIT_DEACTIVATING,
51 [MOUNT_MOUNTING_SIGKILL] = UNIT_DEACTIVATING,
52 [MOUNT_REMOUNTING_SIGTERM] = UNIT_RELOADING,
53 [MOUNT_REMOUNTING_SIGKILL] = UNIT_RELOADING,
54 [MOUNT_UNMOUNTING_SIGTERM] = UNIT_DEACTIVATING,
55 [MOUNT_UNMOUNTING_SIGKILL] = UNIT_DEACTIVATING,
56 [MOUNT_FAILED] = UNIT_FAILED
57 };
58
59 static void mount_init(Unit *u) {
60 Mount *m = MOUNT(u);
61
62 assert(u);
63 assert(u->load_state == UNIT_STUB);
64
65 m->timeout_usec = DEFAULT_TIMEOUT_USEC;
66 m->directory_mode = 0755;
67
68 exec_context_init(&m->exec_context);
69
70 /* The stdio/kmsg bridge socket is on /, in order to avoid a
71 * dep loop, don't use kmsg logging for -.mount */
72 if (!unit_has_name(u, "-.mount")) {
73 m->exec_context.std_output = u->manager->default_std_output;
74 m->exec_context.std_error = u->manager->default_std_error;
75 }
76
77 /* We need to make sure that /bin/mount is always called in
78 * the same process group as us, so that the autofs kernel
79 * side doesn't send us another mount request while we are
80 * already trying to comply its last one. */
81 m->exec_context.same_pgrp = true;
82
83 m->timer_watch.type = WATCH_INVALID;
84
85 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
86
87 UNIT(m)->ignore_on_isolate = true;
88 }
89
90 static void mount_unwatch_control_pid(Mount *m) {
91 assert(m);
92
93 if (m->control_pid <= 0)
94 return;
95
96 unit_unwatch_pid(UNIT(m), m->control_pid);
97 m->control_pid = 0;
98 }
99
100 static void mount_parameters_done(MountParameters *p) {
101 assert(p);
102
103 free(p->what);
104 free(p->options);
105 free(p->fstype);
106
107 p->what = p->options = p->fstype = NULL;
108 }
109
110 static void mount_done(Unit *u) {
111 Mount *m = MOUNT(u);
112
113 assert(m);
114
115 free(m->where);
116 m->where = NULL;
117
118 mount_parameters_done(&m->parameters_etc_fstab);
119 mount_parameters_done(&m->parameters_proc_self_mountinfo);
120 mount_parameters_done(&m->parameters_fragment);
121
122 exec_context_done(&m->exec_context);
123 exec_command_done_array(m->exec_command, _MOUNT_EXEC_COMMAND_MAX);
124 m->control_command = NULL;
125
126 mount_unwatch_control_pid(m);
127
128 unit_unwatch_timer(u, &m->timer_watch);
129 }
130
131 static MountParameters* get_mount_parameters_configured(Mount *m) {
132 assert(m);
133
134 if (m->from_fragment)
135 return &m->parameters_fragment;
136 else if (m->from_etc_fstab)
137 return &m->parameters_etc_fstab;
138
139 return NULL;
140 }
141
142 static MountParameters* get_mount_parameters(Mount *m) {
143 assert(m);
144
145 if (m->from_proc_self_mountinfo)
146 return &m->parameters_proc_self_mountinfo;
147
148 return get_mount_parameters_configured(m);
149 }
150
151 static int mount_add_mount_links(Mount *m) {
152 Unit *other;
153 int r;
154 MountParameters *pm;
155
156 assert(m);
157
158 pm = get_mount_parameters_configured(m);
159
160 /* Adds in links to other mount points that might lie below or
161 * above us in the hierarchy */
162
163 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_MOUNT]) {
164 Mount *n = MOUNT(other);
165 MountParameters *pn;
166
167 if (n == m)
168 continue;
169
170 if (UNIT(n)->load_state != UNIT_LOADED)
171 continue;
172
173 pn = get_mount_parameters_configured(n);
174
175 if (path_startswith(m->where, n->where)) {
176
177 if ((r = unit_add_dependency(UNIT(m), UNIT_AFTER, UNIT(n), true)) < 0)
178 return r;
179
180 if (pn)
181 if ((r = unit_add_dependency(UNIT(m), UNIT_REQUIRES, UNIT(n), true)) < 0)
182 return r;
183
184 } else if (path_startswith(n->where, m->where)) {
185
186 if ((r = unit_add_dependency(UNIT(n), UNIT_AFTER, UNIT(m), true)) < 0)
187 return r;
188
189 if (pm)
190 if ((r = unit_add_dependency(UNIT(n), UNIT_REQUIRES, UNIT(m), true)) < 0)
191 return r;
192
193 } else if (pm && pm->what && path_startswith(pm->what, n->where)) {
194
195 if ((r = unit_add_dependency(UNIT(m), UNIT_AFTER, UNIT(n), true)) < 0)
196 return r;
197
198 if ((r = unit_add_dependency(UNIT(m), UNIT_REQUIRES, UNIT(n), true)) < 0)
199 return r;
200
201 } else if (pn && pn->what && path_startswith(pn->what, m->where)) {
202
203 if ((r = unit_add_dependency(UNIT(n), UNIT_AFTER, UNIT(m), true)) < 0)
204 return r;
205
206 if ((r = unit_add_dependency(UNIT(n), UNIT_REQUIRES, UNIT(m), true)) < 0)
207 return r;
208 }
209 }
210
211 return 0;
212 }
213
214 static int mount_add_swap_links(Mount *m) {
215 Unit *other;
216 int r;
217
218 assert(m);
219
220 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_SWAP])
221 if ((r = swap_add_one_mount_link(SWAP(other), m)) < 0)
222 return r;
223
224 return 0;
225 }
226
227 static int mount_add_path_links(Mount *m) {
228 Unit *other;
229 int r;
230
231 assert(m);
232
233 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_PATH])
234 if ((r = path_add_one_mount_link(PATH(other), m)) < 0)
235 return r;
236
237 return 0;
238 }
239
240 static int mount_add_automount_links(Mount *m) {
241 Unit *other;
242 int r;
243
244 assert(m);
245
246 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_AUTOMOUNT])
247 if ((r = automount_add_one_mount_link(AUTOMOUNT(other), m)) < 0)
248 return r;
249
250 return 0;
251 }
252
253 static int mount_add_socket_links(Mount *m) {
254 Unit *other;
255 int r;
256
257 assert(m);
258
259 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_SOCKET])
260 if ((r = socket_add_one_mount_link(SOCKET(other), m)) < 0)
261 return r;
262
263 return 0;
264 }
265
266 static char* mount_test_option(const char *haystack, const char *needle) {
267 struct mntent me;
268
269 assert(needle);
270
271 /* Like glibc's hasmntopt(), but works on a string, not a
272 * struct mntent */
273
274 if (!haystack)
275 return NULL;
276
277 zero(me);
278 me.mnt_opts = (char*) haystack;
279
280 return hasmntopt(&me, needle);
281 }
282
283 static bool mount_is_network(MountParameters *p) {
284 assert(p);
285
286 if (mount_test_option(p->options, "_netdev"))
287 return true;
288
289 if (p->fstype && fstype_is_network(p->fstype))
290 return true;
291
292 return false;
293 }
294
295 static bool mount_is_bind(MountParameters *p) {
296 assert(p);
297
298 if (mount_test_option(p->options, "bind"))
299 return true;
300
301 if (p->fstype && streq(p->fstype, "bind"))
302 return true;
303
304 return false;
305 }
306
307 static bool needs_quota(MountParameters *p) {
308 assert(p);
309
310 if (mount_is_network(p))
311 return false;
312
313 if (mount_is_bind(p))
314 return false;
315
316 return mount_test_option(p->options, "usrquota") ||
317 mount_test_option(p->options, "grpquota") ||
318 mount_test_option(p->options, "quota") ||
319 mount_test_option(p->options, "usrjquota") ||
320 mount_test_option(p->options, "grpjquota");
321 }
322
323 static int mount_add_fstab_links(Mount *m) {
324 const char *target, *after, *tu_wants = NULL;
325 MountParameters *p;
326 Unit *tu;
327 int r;
328 bool noauto, nofail, handle, automount;
329
330 assert(m);
331
332 if (UNIT(m)->manager->running_as != MANAGER_SYSTEM)
333 return 0;
334
335 if (!(p = get_mount_parameters_configured(m)))
336 return 0;
337
338 if (p != &m->parameters_etc_fstab)
339 return 0;
340
341 noauto = !!mount_test_option(p->options, "noauto");
342 nofail = !!mount_test_option(p->options, "nofail");
343 automount =
344 mount_test_option(p->options, "comment=systemd.automount") ||
345 mount_test_option(p->options, "x-systemd-automount");
346 handle =
347 automount ||
348 mount_test_option(p->options, "comment=systemd.mount") ||
349 mount_test_option(p->options, "x-systemd-mount") ||
350 UNIT(m)->manager->mount_auto;
351
352 if (mount_is_network(p)) {
353 target = SPECIAL_REMOTE_FS_TARGET;
354 after = tu_wants = SPECIAL_REMOTE_FS_PRE_TARGET;
355 } else {
356 target = SPECIAL_LOCAL_FS_TARGET;
357 after = SPECIAL_LOCAL_FS_PRE_TARGET;
358 }
359
360 r = manager_load_unit(UNIT(m)->manager, target, NULL, NULL, &tu);
361 if (r < 0)
362 return r;
363
364 if (tu_wants) {
365 r = unit_add_dependency_by_name(tu, UNIT_WANTS, tu_wants, NULL, true);
366 if (r < 0)
367 return r;
368 }
369
370 if (after) {
371 r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, after, NULL, true);
372 if (r < 0)
373 return r;
374 }
375
376 if (automount) {
377 Unit *am;
378
379 if ((r = unit_load_related_unit(UNIT(m), ".automount", &am)) < 0)
380 return r;
381
382 /* If auto is configured as well also pull in the
383 * mount right-away, but don't rely on it. */
384 if (!noauto) /* automount + auto */
385 if ((r = unit_add_dependency(tu, UNIT_WANTS, UNIT(m), true)) < 0)
386 return r;
387
388 /* Install automount unit */
389 if (!nofail) /* automount + fail */
390 return unit_add_two_dependencies(tu, UNIT_AFTER, UNIT_REQUIRES, am, true);
391 else /* automount + nofail */
392 return unit_add_two_dependencies(tu, UNIT_AFTER, UNIT_WANTS, am, true);
393
394 } else if (handle && !noauto) {
395
396 /* Automatically add mount points that aren't natively
397 * configured to local-fs.target */
398
399 if (!nofail) /* auto + fail */
400 return unit_add_two_dependencies(tu, UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true);
401 else /* auto + nofail */
402 return unit_add_dependency(tu, UNIT_WANTS, UNIT(m), true);
403 }
404
405 return 0;
406 }
407
408 static int mount_add_device_links(Mount *m) {
409 MountParameters *p;
410 int r;
411
412 assert(m);
413
414 if (!(p = get_mount_parameters_configured(m)))
415 return 0;
416
417 if (!p->what)
418 return 0;
419
420 if (!mount_is_bind(p) &&
421 !path_equal(m->where, "/") &&
422 p == &m->parameters_etc_fstab) {
423 bool nofail, noauto;
424
425 noauto = !!mount_test_option(p->options, "noauto");
426 nofail = !!mount_test_option(p->options, "nofail");
427
428 if ((r = unit_add_node_link(UNIT(m), p->what,
429 !noauto && nofail &&
430 UNIT(m)->manager->running_as == MANAGER_SYSTEM)) < 0)
431 return r;
432 }
433
434 if (p->passno > 0 &&
435 !mount_is_bind(p) &&
436 UNIT(m)->manager->running_as == MANAGER_SYSTEM &&
437 !path_equal(m->where, "/")) {
438 char *name;
439 Unit *fsck;
440 /* Let's add in the fsck service */
441
442 /* aka SPECIAL_FSCK_SERVICE */
443 if (!(name = unit_name_from_path_instance("fsck", p->what, ".service")))
444 return -ENOMEM;
445
446 if ((r = manager_load_unit_prepare(UNIT(m)->manager, name, NULL, NULL, &fsck)) < 0) {
447 log_warning("Failed to prepare unit %s: %s", name, strerror(-r));
448 free(name);
449 return r;
450 }
451
452 free(name);
453
454 SERVICE(fsck)->fsck_passno = p->passno;
455
456 if ((r = unit_add_two_dependencies(UNIT(m), UNIT_AFTER, UNIT_REQUIRES, fsck, true)) < 0)
457 return r;
458 }
459
460 return 0;
461 }
462
463 static int mount_add_default_dependencies(Mount *m) {
464 int r;
465 MountParameters *p;
466
467 assert(m);
468
469 if (UNIT(m)->manager->running_as != MANAGER_SYSTEM)
470 return 0;
471
472 p = get_mount_parameters_configured(m);
473 if (p && needs_quota(p)) {
474 if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTACHECK_SERVICE, NULL, true)) < 0 ||
475 (r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTAON_SERVICE, NULL, true)) < 0)
476 return r;
477 }
478
479 if (!path_equal(m->where, "/"))
480 if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true)) < 0)
481 return r;
482
483 return 0;
484 }
485
486 static int mount_fix_timeouts(Mount *m) {
487 MountParameters *p;
488 const char *timeout = NULL;
489 Unit *other;
490 Iterator i;
491 usec_t u;
492 char *t;
493 int r;
494
495 assert(m);
496
497 if (!(p = get_mount_parameters_configured(m)))
498 return 0;
499
500 /* Allow configuration how long we wait for a device that
501 * backs a mount point to show up. This is useful to support
502 * endless device timeouts for devices that show up only after
503 * user input, like crypto devices. */
504
505 if ((timeout = mount_test_option(p->options, "comment=systemd.device-timeout")))
506 timeout += 31;
507 else if ((timeout = mount_test_option(p->options, "x-systemd-device-timeout")))
508 timeout += 25;
509 else
510 return 0;
511
512 t = strndup(timeout, strcspn(timeout, ",;" WHITESPACE));
513 if (!t)
514 return -ENOMEM;
515
516 r = parse_usec(t, &u);
517 free(t);
518
519 if (r < 0) {
520 log_warning("Failed to parse timeout for %s, ignoring: %s", m->where, timeout);
521 return r;
522 }
523
524 SET_FOREACH(other, UNIT(m)->dependencies[UNIT_AFTER], i) {
525 if (other->type != UNIT_DEVICE)
526 continue;
527
528 other->job_timeout = u;
529 }
530
531 return 0;
532 }
533
534 static int mount_verify(Mount *m) {
535 bool b;
536 char *e;
537 assert(m);
538
539 if (UNIT(m)->load_state != UNIT_LOADED)
540 return 0;
541
542 if (!m->from_etc_fstab && !m->from_fragment && !m->from_proc_self_mountinfo)
543 return -ENOENT;
544
545 if (!(e = unit_name_from_path(m->where, ".mount")))
546 return -ENOMEM;
547
548 b = unit_has_name(UNIT(m), e);
549 free(e);
550
551 if (!b) {
552 log_error("%s's Where setting doesn't match unit name. Refusing.", UNIT(m)->id);
553 return -EINVAL;
554 }
555
556 if (mount_point_is_api(m->where) || mount_point_ignore(m->where)) {
557 log_error("Cannot create mount unit for API file system %s. Refusing.", m->where);
558 return -EINVAL;
559 }
560
561 if (UNIT(m)->fragment_path && !m->parameters_fragment.what) {
562 log_error("%s's What setting is missing. Refusing.", UNIT(m)->id);
563 return -EBADMSG;
564 }
565
566 if (m->exec_context.pam_name && m->exec_context.kill_mode != KILL_CONTROL_GROUP) {
567 log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(m)->id);
568 return -EINVAL;
569 }
570
571 return 0;
572 }
573
574 static int mount_load(Unit *u) {
575 Mount *m = MOUNT(u);
576 int r;
577
578 assert(u);
579 assert(u->load_state == UNIT_STUB);
580
581 if ((r = unit_load_fragment_and_dropin_optional(u)) < 0)
582 return r;
583
584 /* This is a new unit? Then let's add in some extras */
585 if (u->load_state == UNIT_LOADED) {
586 if ((r = unit_add_exec_dependencies(u, &m->exec_context)) < 0)
587 return r;
588
589 if (UNIT(m)->fragment_path)
590 m->from_fragment = true;
591 else if (m->from_etc_fstab)
592 /* We always add several default dependencies to fstab mounts,
593 * but we do not want the implicit complementing of Wants= with After=
594 * in the target unit that this mount unit will be hooked into. */
595 UNIT(m)->default_dependencies = false;
596
597 if (!m->where)
598 if (!(m->where = unit_name_to_path(u->id)))
599 return -ENOMEM;
600
601 path_kill_slashes(m->where);
602
603 if (!UNIT(m)->description)
604 if ((r = unit_set_description(u, m->where)) < 0)
605 return r;
606
607 if ((r = mount_add_device_links(m)) < 0)
608 return r;
609
610 if ((r = mount_add_mount_links(m)) < 0)
611 return r;
612
613 if ((r = mount_add_socket_links(m)) < 0)
614 return r;
615
616 if ((r = mount_add_swap_links(m)) < 0)
617 return r;
618
619 if ((r = mount_add_path_links(m)) < 0)
620 return r;
621
622 if ((r = mount_add_automount_links(m)) < 0)
623 return r;
624
625 if ((r = mount_add_fstab_links(m)) < 0)
626 return r;
627
628 if (UNIT(m)->default_dependencies || m->from_etc_fstab)
629 if ((r = mount_add_default_dependencies(m)) < 0)
630 return r;
631
632 if ((r = unit_add_default_cgroups(u)) < 0)
633 return r;
634
635 mount_fix_timeouts(m);
636 }
637
638 return mount_verify(m);
639 }
640
641 static int mount_notify_automount(Mount *m, int status) {
642 Unit *p;
643 int r;
644 Iterator i;
645
646 assert(m);
647
648 SET_FOREACH(p, UNIT(m)->dependencies[UNIT_TRIGGERED_BY], i)
649 if (p->type == UNIT_AUTOMOUNT) {
650 r = automount_send_ready(AUTOMOUNT(p), status);
651 if (r < 0)
652 return r;
653 }
654
655 return 0;
656 }
657
658 static void mount_set_state(Mount *m, MountState state) {
659 MountState old_state;
660 assert(m);
661
662 old_state = m->state;
663 m->state = state;
664
665 if (state != MOUNT_MOUNTING &&
666 state != MOUNT_MOUNTING_DONE &&
667 state != MOUNT_REMOUNTING &&
668 state != MOUNT_UNMOUNTING &&
669 state != MOUNT_MOUNTING_SIGTERM &&
670 state != MOUNT_MOUNTING_SIGKILL &&
671 state != MOUNT_UNMOUNTING_SIGTERM &&
672 state != MOUNT_UNMOUNTING_SIGKILL &&
673 state != MOUNT_REMOUNTING_SIGTERM &&
674 state != MOUNT_REMOUNTING_SIGKILL) {
675 unit_unwatch_timer(UNIT(m), &m->timer_watch);
676 mount_unwatch_control_pid(m);
677 m->control_command = NULL;
678 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
679 }
680
681 if (state == MOUNT_MOUNTED ||
682 state == MOUNT_REMOUNTING)
683 mount_notify_automount(m, 0);
684 else if (state == MOUNT_DEAD ||
685 state == MOUNT_UNMOUNTING ||
686 state == MOUNT_MOUNTING_SIGTERM ||
687 state == MOUNT_MOUNTING_SIGKILL ||
688 state == MOUNT_REMOUNTING_SIGTERM ||
689 state == MOUNT_REMOUNTING_SIGKILL ||
690 state == MOUNT_UNMOUNTING_SIGTERM ||
691 state == MOUNT_UNMOUNTING_SIGKILL ||
692 state == MOUNT_FAILED)
693 mount_notify_automount(m, -ENODEV);
694
695 if (state != old_state)
696 log_debug("%s changed %s -> %s",
697 UNIT(m)->id,
698 mount_state_to_string(old_state),
699 mount_state_to_string(state));
700
701 unit_notify(UNIT(m), state_translation_table[old_state], state_translation_table[state], m->reload_result == MOUNT_SUCCESS);
702 m->reload_result = MOUNT_SUCCESS;
703 }
704
705 static int mount_coldplug(Unit *u) {
706 Mount *m = MOUNT(u);
707 MountState new_state = MOUNT_DEAD;
708 int r;
709
710 assert(m);
711 assert(m->state == MOUNT_DEAD);
712
713 if (m->deserialized_state != m->state)
714 new_state = m->deserialized_state;
715 else if (m->from_proc_self_mountinfo)
716 new_state = MOUNT_MOUNTED;
717
718 if (new_state != m->state) {
719
720 if (new_state == MOUNT_MOUNTING ||
721 new_state == MOUNT_MOUNTING_DONE ||
722 new_state == MOUNT_REMOUNTING ||
723 new_state == MOUNT_UNMOUNTING ||
724 new_state == MOUNT_MOUNTING_SIGTERM ||
725 new_state == MOUNT_MOUNTING_SIGKILL ||
726 new_state == MOUNT_UNMOUNTING_SIGTERM ||
727 new_state == MOUNT_UNMOUNTING_SIGKILL ||
728 new_state == MOUNT_REMOUNTING_SIGTERM ||
729 new_state == MOUNT_REMOUNTING_SIGKILL) {
730
731 if (m->control_pid <= 0)
732 return -EBADMSG;
733
734 if ((r = unit_watch_pid(UNIT(m), m->control_pid)) < 0)
735 return r;
736
737 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
738 return r;
739 }
740
741 mount_set_state(m, new_state);
742 }
743
744 return 0;
745 }
746
747 static void mount_dump(Unit *u, FILE *f, const char *prefix) {
748 Mount *m = MOUNT(u);
749 MountParameters *p;
750
751 assert(m);
752 assert(f);
753
754 p = get_mount_parameters(m);
755
756 fprintf(f,
757 "%sMount State: %s\n"
758 "%sResult: %s\n"
759 "%sWhere: %s\n"
760 "%sWhat: %s\n"
761 "%sFile System Type: %s\n"
762 "%sOptions: %s\n"
763 "%sFrom /etc/fstab: %s\n"
764 "%sFrom /proc/self/mountinfo: %s\n"
765 "%sFrom fragment: %s\n"
766 "%sDirectoryMode: %04o\n",
767 prefix, mount_state_to_string(m->state),
768 prefix, mount_result_to_string(m->result),
769 prefix, m->where,
770 prefix, strna(p->what),
771 prefix, strna(p->fstype),
772 prefix, strna(p->options),
773 prefix, yes_no(m->from_etc_fstab),
774 prefix, yes_no(m->from_proc_self_mountinfo),
775 prefix, yes_no(m->from_fragment),
776 prefix, m->directory_mode);
777
778 if (m->control_pid > 0)
779 fprintf(f,
780 "%sControl PID: %lu\n",
781 prefix, (unsigned long) m->control_pid);
782
783 exec_context_dump(&m->exec_context, f, prefix);
784 }
785
786 static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
787 pid_t pid;
788 int r;
789
790 assert(m);
791 assert(c);
792 assert(_pid);
793
794 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
795 goto fail;
796
797 if ((r = exec_spawn(c,
798 NULL,
799 &m->exec_context,
800 NULL, 0,
801 UNIT(m)->manager->environment,
802 true,
803 true,
804 true,
805 UNIT(m)->manager->confirm_spawn,
806 UNIT(m)->cgroup_bondings,
807 UNIT(m)->cgroup_attributes,
808 &pid)) < 0)
809 goto fail;
810
811 if ((r = unit_watch_pid(UNIT(m), pid)) < 0)
812 /* FIXME: we need to do something here */
813 goto fail;
814
815 *_pid = pid;
816
817 return 0;
818
819 fail:
820 unit_unwatch_timer(UNIT(m), &m->timer_watch);
821
822 return r;
823 }
824
825 static void mount_enter_dead(Mount *m, MountResult f) {
826 assert(m);
827
828 if (f != MOUNT_SUCCESS)
829 m->result = f;
830
831 mount_set_state(m, m->result != MOUNT_SUCCESS ? MOUNT_FAILED : MOUNT_DEAD);
832 }
833
834 static void mount_enter_mounted(Mount *m, MountResult f) {
835 assert(m);
836
837 if (f != MOUNT_SUCCESS)
838 m->result = f;
839
840 mount_set_state(m, MOUNT_MOUNTED);
841 }
842
843 static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
844 int r;
845 Set *pid_set = NULL;
846 bool wait_for_exit = false;
847
848 assert(m);
849
850 if (f != MOUNT_SUCCESS)
851 m->result = f;
852
853 if (m->exec_context.kill_mode != KILL_NONE) {
854 int sig = (state == MOUNT_MOUNTING_SIGTERM ||
855 state == MOUNT_UNMOUNTING_SIGTERM ||
856 state == MOUNT_REMOUNTING_SIGTERM) ? m->exec_context.kill_signal : SIGKILL;
857
858 if (m->control_pid > 0) {
859 if (kill_and_sigcont(m->control_pid, sig) < 0 && errno != ESRCH)
860
861 log_warning("Failed to kill control process %li: %m", (long) m->control_pid);
862 else
863 wait_for_exit = true;
864 }
865
866 if (m->exec_context.kill_mode == KILL_CONTROL_GROUP) {
867
868 if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
869 r = -ENOMEM;
870 goto fail;
871 }
872
873 /* Exclude the control pid from being killed via the cgroup */
874 if (m->control_pid > 0)
875 if ((r = set_put(pid_set, LONG_TO_PTR(m->control_pid))) < 0)
876 goto fail;
877
878 if ((r = cgroup_bonding_kill_list(UNIT(m)->cgroup_bondings, sig, true, pid_set)) < 0) {
879 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
880 log_warning("Failed to kill control group: %s", strerror(-r));
881 } else if (r > 0)
882 wait_for_exit = true;
883
884 set_free(pid_set);
885 pid_set = NULL;
886 }
887 }
888
889 if (wait_for_exit) {
890 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
891 goto fail;
892
893 mount_set_state(m, state);
894 } else if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
895 mount_enter_mounted(m, MOUNT_SUCCESS);
896 else
897 mount_enter_dead(m, MOUNT_SUCCESS);
898
899 return;
900
901 fail:
902 log_warning("%s failed to kill processes: %s", UNIT(m)->id, strerror(-r));
903
904 if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
905 mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
906 else
907 mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
908
909 if (pid_set)
910 set_free(pid_set);
911 }
912
913 static void mount_enter_unmounting(Mount *m) {
914 int r;
915
916 assert(m);
917
918 m->control_command_id = MOUNT_EXEC_UNMOUNT;
919 m->control_command = m->exec_command + MOUNT_EXEC_UNMOUNT;
920
921 if ((r = exec_command_set(
922 m->control_command,
923 "/bin/umount",
924 m->where,
925 NULL)) < 0)
926 goto fail;
927
928 mount_unwatch_control_pid(m);
929
930 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
931 goto fail;
932
933 mount_set_state(m, MOUNT_UNMOUNTING);
934
935 return;
936
937 fail:
938 log_warning("%s failed to run 'umount' task: %s", UNIT(m)->id, strerror(-r));
939 mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
940 }
941
942 static void mount_enter_mounting(Mount *m) {
943 int r;
944 MountParameters *p;
945
946 assert(m);
947
948 m->control_command_id = MOUNT_EXEC_MOUNT;
949 m->control_command = m->exec_command + MOUNT_EXEC_MOUNT;
950
951 mkdir_p(m->where, m->directory_mode);
952
953 /* Create the source directory for bind-mounts if needed */
954 p = get_mount_parameters_configured(m);
955 if (p && mount_is_bind(p))
956 mkdir_p(p->what, m->directory_mode);
957
958 if (m->from_fragment)
959 r = exec_command_set(
960 m->control_command,
961 "/bin/mount",
962 m->parameters_fragment.what,
963 m->where,
964 "-t", m->parameters_fragment.fstype ? m->parameters_fragment.fstype : "auto",
965 m->parameters_fragment.options ? "-o" : NULL, m->parameters_fragment.options,
966 NULL);
967 else if (m->from_etc_fstab)
968 r = exec_command_set(
969 m->control_command,
970 "/bin/mount",
971 m->where,
972 NULL);
973 else
974 r = -ENOENT;
975
976 if (r < 0)
977 goto fail;
978
979 mount_unwatch_control_pid(m);
980
981 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
982 goto fail;
983
984 mount_set_state(m, MOUNT_MOUNTING);
985
986 return;
987
988 fail:
989 log_warning("%s failed to run 'mount' task: %s", UNIT(m)->id, strerror(-r));
990 mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
991 }
992
993 static void mount_enter_mounting_done(Mount *m) {
994 assert(m);
995
996 mount_set_state(m, MOUNT_MOUNTING_DONE);
997 }
998
999 static void mount_enter_remounting(Mount *m) {
1000 int r;
1001
1002 assert(m);
1003
1004 m->control_command_id = MOUNT_EXEC_REMOUNT;
1005 m->control_command = m->exec_command + MOUNT_EXEC_REMOUNT;
1006
1007 if (m->from_fragment) {
1008 char *buf = NULL;
1009 const char *o;
1010
1011 if (m->parameters_fragment.options) {
1012 if (!(buf = strappend("remount,", m->parameters_fragment.options))) {
1013 r = -ENOMEM;
1014 goto fail;
1015 }
1016
1017 o = buf;
1018 } else
1019 o = "remount";
1020
1021 r = exec_command_set(
1022 m->control_command,
1023 "/bin/mount",
1024 m->parameters_fragment.what,
1025 m->where,
1026 "-t", m->parameters_fragment.fstype ? m->parameters_fragment.fstype : "auto",
1027 "-o", o,
1028 NULL);
1029
1030 free(buf);
1031 } else if (m->from_etc_fstab)
1032 r = exec_command_set(
1033 m->control_command,
1034 "/bin/mount",
1035 m->where,
1036 "-o", "remount",
1037 NULL);
1038 else
1039 r = -ENOENT;
1040
1041 if (r < 0)
1042 goto fail;
1043
1044 mount_unwatch_control_pid(m);
1045
1046 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
1047 goto fail;
1048
1049 mount_set_state(m, MOUNT_REMOUNTING);
1050
1051 return;
1052
1053 fail:
1054 log_warning("%s failed to run 'remount' task: %s", UNIT(m)->id, strerror(-r));
1055 m->reload_result = MOUNT_FAILURE_RESOURCES;
1056 mount_enter_mounted(m, MOUNT_SUCCESS);
1057 }
1058
1059 static int mount_start(Unit *u) {
1060 Mount *m = MOUNT(u);
1061
1062 assert(m);
1063
1064 /* We cannot fulfill this request right now, try again later
1065 * please! */
1066 if (m->state == MOUNT_UNMOUNTING ||
1067 m->state == MOUNT_UNMOUNTING_SIGTERM ||
1068 m->state == MOUNT_UNMOUNTING_SIGKILL ||
1069 m->state == MOUNT_MOUNTING_SIGTERM ||
1070 m->state == MOUNT_MOUNTING_SIGKILL)
1071 return -EAGAIN;
1072
1073 /* Already on it! */
1074 if (m->state == MOUNT_MOUNTING)
1075 return 0;
1076
1077 assert(m->state == MOUNT_DEAD || m->state == MOUNT_FAILED);
1078
1079 m->result = MOUNT_SUCCESS;
1080 m->reload_result = MOUNT_SUCCESS;
1081
1082 mount_enter_mounting(m);
1083 return 0;
1084 }
1085
1086 static int mount_stop(Unit *u) {
1087 Mount *m = MOUNT(u);
1088
1089 assert(m);
1090
1091 /* Already on it */
1092 if (m->state == MOUNT_UNMOUNTING ||
1093 m->state == MOUNT_UNMOUNTING_SIGKILL ||
1094 m->state == MOUNT_UNMOUNTING_SIGTERM ||
1095 m->state == MOUNT_MOUNTING_SIGTERM ||
1096 m->state == MOUNT_MOUNTING_SIGKILL)
1097 return 0;
1098
1099 assert(m->state == MOUNT_MOUNTING ||
1100 m->state == MOUNT_MOUNTING_DONE ||
1101 m->state == MOUNT_MOUNTED ||
1102 m->state == MOUNT_REMOUNTING ||
1103 m->state == MOUNT_REMOUNTING_SIGTERM ||
1104 m->state == MOUNT_REMOUNTING_SIGKILL);
1105
1106 mount_enter_unmounting(m);
1107 return 0;
1108 }
1109
1110 static int mount_reload(Unit *u) {
1111 Mount *m = MOUNT(u);
1112
1113 assert(m);
1114
1115 if (m->state == MOUNT_MOUNTING_DONE)
1116 return -EAGAIN;
1117
1118 assert(m->state == MOUNT_MOUNTED);
1119
1120 mount_enter_remounting(m);
1121 return 0;
1122 }
1123
1124 static int mount_serialize(Unit *u, FILE *f, FDSet *fds) {
1125 Mount *m = MOUNT(u);
1126
1127 assert(m);
1128 assert(f);
1129 assert(fds);
1130
1131 unit_serialize_item(u, f, "state", mount_state_to_string(m->state));
1132 unit_serialize_item(u, f, "result", mount_result_to_string(m->result));
1133 unit_serialize_item(u, f, "reload-result", mount_result_to_string(m->reload_result));
1134
1135 if (m->control_pid > 0)
1136 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) m->control_pid);
1137
1138 if (m->control_command_id >= 0)
1139 unit_serialize_item(u, f, "control-command", mount_exec_command_to_string(m->control_command_id));
1140
1141 return 0;
1142 }
1143
1144 static int mount_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1145 Mount *m = MOUNT(u);
1146
1147 assert(u);
1148 assert(key);
1149 assert(value);
1150 assert(fds);
1151
1152 if (streq(key, "state")) {
1153 MountState state;
1154
1155 if ((state = mount_state_from_string(value)) < 0)
1156 log_debug("Failed to parse state value %s", value);
1157 else
1158 m->deserialized_state = state;
1159 } else if (streq(key, "result")) {
1160 MountResult f;
1161
1162 f = mount_result_from_string(value);
1163 if (f < 0)
1164 log_debug("Failed to parse result value %s", value);
1165 else if (f != MOUNT_SUCCESS)
1166 m->result = f;
1167
1168 } else if (streq(key, "reload-result")) {
1169 MountResult f;
1170
1171 f = mount_result_from_string(value);
1172 if (f < 0)
1173 log_debug("Failed to parse reload result value %s", value);
1174 else if (f != MOUNT_SUCCESS)
1175 m->reload_result = f;
1176
1177 } else if (streq(key, "control-pid")) {
1178 pid_t pid;
1179
1180 if (parse_pid(value, &pid) < 0)
1181 log_debug("Failed to parse control-pid value %s", value);
1182 else
1183 m->control_pid = pid;
1184 } else if (streq(key, "control-command")) {
1185 MountExecCommand id;
1186
1187 if ((id = mount_exec_command_from_string(value)) < 0)
1188 log_debug("Failed to parse exec-command value %s", value);
1189 else {
1190 m->control_command_id = id;
1191 m->control_command = m->exec_command + id;
1192 }
1193
1194 } else
1195 log_debug("Unknown serialization key '%s'", key);
1196
1197 return 0;
1198 }
1199
1200 static UnitActiveState mount_active_state(Unit *u) {
1201 assert(u);
1202
1203 return state_translation_table[MOUNT(u)->state];
1204 }
1205
1206 static const char *mount_sub_state_to_string(Unit *u) {
1207 assert(u);
1208
1209 return mount_state_to_string(MOUNT(u)->state);
1210 }
1211
1212 static bool mount_check_gc(Unit *u) {
1213 Mount *m = MOUNT(u);
1214
1215 assert(m);
1216
1217 return m->from_etc_fstab || m->from_proc_self_mountinfo;
1218 }
1219
1220 static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1221 Mount *m = MOUNT(u);
1222 MountResult f;
1223
1224 assert(m);
1225 assert(pid >= 0);
1226
1227 if (pid != m->control_pid)
1228 return;
1229
1230 m->control_pid = 0;
1231
1232 if (is_clean_exit(code, status))
1233 f = MOUNT_SUCCESS;
1234 else if (code == CLD_EXITED)
1235 f = MOUNT_FAILURE_EXIT_CODE;
1236 else if (code == CLD_KILLED)
1237 f = MOUNT_FAILURE_SIGNAL;
1238 else if (code == CLD_DUMPED)
1239 f = MOUNT_FAILURE_CORE_DUMP;
1240 else
1241 assert_not_reached("Unknown code");
1242
1243 if (f != MOUNT_SUCCESS)
1244 m->result = f;
1245
1246 if (m->control_command) {
1247 exec_status_exit(&m->control_command->exec_status, &m->exec_context, pid, code, status);
1248
1249 m->control_command = NULL;
1250 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
1251 }
1252
1253 log_full(f == MOUNT_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
1254 "%s mount process exited, code=%s status=%i", u->id, sigchld_code_to_string(code), status);
1255
1256 /* Note that mount(8) returning and the kernel sending us a
1257 * mount table change event might happen out-of-order. If an
1258 * operation succeed we assume the kernel will follow soon too
1259 * and already change into the resulting state. If it fails
1260 * we check if the kernel still knows about the mount. and
1261 * change state accordingly. */
1262
1263 switch (m->state) {
1264
1265 case MOUNT_MOUNTING:
1266 case MOUNT_MOUNTING_DONE:
1267 case MOUNT_MOUNTING_SIGKILL:
1268 case MOUNT_MOUNTING_SIGTERM:
1269
1270 if (f == MOUNT_SUCCESS)
1271 mount_enter_mounted(m, f);
1272 else if (m->from_proc_self_mountinfo)
1273 mount_enter_mounted(m, f);
1274 else
1275 mount_enter_dead(m, f);
1276 break;
1277
1278 case MOUNT_REMOUNTING:
1279 case MOUNT_REMOUNTING_SIGKILL:
1280 case MOUNT_REMOUNTING_SIGTERM:
1281
1282 m->reload_result = f;
1283 if (m->from_proc_self_mountinfo)
1284 mount_enter_mounted(m, MOUNT_SUCCESS);
1285 else
1286 mount_enter_dead(m, MOUNT_SUCCESS);
1287
1288 break;
1289
1290 case MOUNT_UNMOUNTING:
1291 case MOUNT_UNMOUNTING_SIGKILL:
1292 case MOUNT_UNMOUNTING_SIGTERM:
1293
1294 if (f == MOUNT_SUCCESS)
1295 mount_enter_dead(m, f);
1296 else if (m->from_proc_self_mountinfo)
1297 mount_enter_mounted(m, f);
1298 else
1299 mount_enter_dead(m, f);
1300 break;
1301
1302 default:
1303 assert_not_reached("Uh, control process died at wrong time.");
1304 }
1305
1306 /* Notify clients about changed exit status */
1307 unit_add_to_dbus_queue(u);
1308 }
1309
1310 static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
1311 Mount *m = MOUNT(u);
1312
1313 assert(m);
1314 assert(elapsed == 1);
1315 assert(w == &m->timer_watch);
1316
1317 switch (m->state) {
1318
1319 case MOUNT_MOUNTING:
1320 case MOUNT_MOUNTING_DONE:
1321 log_warning("%s mounting timed out. Stopping.", u->id);
1322 mount_enter_signal(m, MOUNT_MOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
1323 break;
1324
1325 case MOUNT_REMOUNTING:
1326 log_warning("%s remounting timed out. Stopping.", u->id);
1327 m->reload_result = MOUNT_FAILURE_TIMEOUT;
1328 mount_enter_mounted(m, MOUNT_SUCCESS);
1329 break;
1330
1331 case MOUNT_UNMOUNTING:
1332 log_warning("%s unmounting timed out. Stopping.", u->id);
1333 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
1334 break;
1335
1336 case MOUNT_MOUNTING_SIGTERM:
1337 if (m->exec_context.send_sigkill) {
1338 log_warning("%s mounting timed out. Killing.", u->id);
1339 mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1340 } else {
1341 log_warning("%s mounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1342
1343 if (m->from_proc_self_mountinfo)
1344 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1345 else
1346 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1347 }
1348 break;
1349
1350 case MOUNT_REMOUNTING_SIGTERM:
1351 if (m->exec_context.send_sigkill) {
1352 log_warning("%s remounting timed out. Killing.", u->id);
1353 mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1354 } else {
1355 log_warning("%s remounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1356
1357 if (m->from_proc_self_mountinfo)
1358 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1359 else
1360 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1361 }
1362 break;
1363
1364 case MOUNT_UNMOUNTING_SIGTERM:
1365 if (m->exec_context.send_sigkill) {
1366 log_warning("%s unmounting timed out. Killing.", u->id);
1367 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1368 } else {
1369 log_warning("%s unmounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1370
1371 if (m->from_proc_self_mountinfo)
1372 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1373 else
1374 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1375 }
1376 break;
1377
1378 case MOUNT_MOUNTING_SIGKILL:
1379 case MOUNT_REMOUNTING_SIGKILL:
1380 case MOUNT_UNMOUNTING_SIGKILL:
1381 log_warning("%s mount process still around after SIGKILL. Ignoring.", u->id);
1382
1383 if (m->from_proc_self_mountinfo)
1384 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1385 else
1386 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1387 break;
1388
1389 default:
1390 assert_not_reached("Timeout at wrong time.");
1391 }
1392 }
1393
1394 static int mount_add_one(
1395 Manager *m,
1396 const char *what,
1397 const char *where,
1398 const char *options,
1399 const char *fstype,
1400 int passno,
1401 bool from_proc_self_mountinfo,
1402 bool set_flags) {
1403 int r;
1404 Unit *u;
1405 bool delete;
1406 char *e, *w = NULL, *o = NULL, *f = NULL;
1407 MountParameters *p;
1408
1409 assert(m);
1410 assert(what);
1411 assert(where);
1412 assert(options);
1413 assert(fstype);
1414
1415 assert(!set_flags || from_proc_self_mountinfo);
1416
1417 /* Ignore API mount points. They should never be referenced in
1418 * dependencies ever. */
1419 if (mount_point_is_api(where) || mount_point_ignore(where))
1420 return 0;
1421
1422 if (streq(fstype, "autofs"))
1423 return 0;
1424
1425 /* probably some kind of swap, ignore */
1426 if (!is_path(where))
1427 return 0;
1428
1429 e = unit_name_from_path(where, ".mount");
1430 if (!e)
1431 return -ENOMEM;
1432
1433 u = manager_get_unit(m, e);
1434 if (!u) {
1435 delete = true;
1436
1437 u = unit_new(m, sizeof(Mount));
1438 if (!u) {
1439 free(e);
1440 return -ENOMEM;
1441 }
1442
1443 r = unit_add_name(u, e);
1444 free(e);
1445
1446 if (r < 0)
1447 goto fail;
1448
1449 MOUNT(u)->where = strdup(where);
1450 if (!MOUNT(u)->where) {
1451 r = -ENOMEM;
1452 goto fail;
1453 }
1454
1455 unit_add_to_load_queue(u);
1456 } else {
1457 delete = false;
1458 free(e);
1459 }
1460
1461 if (!(w = strdup(what)) ||
1462 !(o = strdup(options)) ||
1463 !(f = strdup(fstype))) {
1464 r = -ENOMEM;
1465 goto fail;
1466 }
1467
1468 if (from_proc_self_mountinfo) {
1469 p = &MOUNT(u)->parameters_proc_self_mountinfo;
1470
1471 if (set_flags) {
1472 MOUNT(u)->is_mounted = true;
1473 MOUNT(u)->just_mounted = !MOUNT(u)->from_proc_self_mountinfo;
1474 MOUNT(u)->just_changed = !streq_ptr(p->options, o);
1475 }
1476
1477 MOUNT(u)->from_proc_self_mountinfo = true;
1478 } else {
1479 p = &MOUNT(u)->parameters_etc_fstab;
1480 MOUNT(u)->from_etc_fstab = true;
1481 }
1482
1483 free(p->what);
1484 p->what = w;
1485
1486 free(p->options);
1487 p->options = o;
1488
1489 free(p->fstype);
1490 p->fstype = f;
1491
1492 p->passno = passno;
1493
1494 unit_add_to_dbus_queue(u);
1495
1496 return 0;
1497
1498 fail:
1499 free(w);
1500 free(o);
1501 free(f);
1502
1503 if (delete && u)
1504 unit_free(u);
1505
1506 return r;
1507 }
1508
1509 static int mount_find_pri(char *options) {
1510 char *end, *pri;
1511 unsigned long r;
1512
1513 if (!(pri = mount_test_option(options, "pri")))
1514 return 0;
1515
1516 pri += 4;
1517
1518 errno = 0;
1519 r = strtoul(pri, &end, 10);
1520
1521 if (errno != 0)
1522 return -errno;
1523
1524 if (end == pri || (*end != ',' && *end != 0))
1525 return -EINVAL;
1526
1527 return (int) r;
1528 }
1529
1530 static int mount_load_etc_fstab(Manager *m) {
1531 FILE *f;
1532 int r = 0;
1533 struct mntent* me;
1534
1535 assert(m);
1536
1537 errno = 0;
1538 if (!(f = setmntent("/etc/fstab", "r")))
1539 return -errno;
1540
1541 while ((me = getmntent(f))) {
1542 char *where, *what;
1543 int k;
1544
1545 if (!(what = fstab_node_to_udev_node(me->mnt_fsname))) {
1546 r = -ENOMEM;
1547 goto finish;
1548 }
1549
1550 if (!(where = strdup(me->mnt_dir))) {
1551 free(what);
1552 r = -ENOMEM;
1553 goto finish;
1554 }
1555
1556 if (what[0] == '/')
1557 path_kill_slashes(what);
1558
1559 if (where[0] == '/')
1560 path_kill_slashes(where);
1561
1562 if (streq(me->mnt_type, "swap")) {
1563 int pri;
1564
1565 if ((pri = mount_find_pri(me->mnt_opts)) < 0)
1566 k = pri;
1567 else
1568 k = swap_add_one(m,
1569 what,
1570 NULL,
1571 pri,
1572 !!mount_test_option(me->mnt_opts, "noauto"),
1573 !!mount_test_option(me->mnt_opts, "nofail"),
1574 !!mount_test_option(me->mnt_opts, "comment=systemd.swapon"),
1575 false);
1576 } else
1577 k = mount_add_one(m, what, where, me->mnt_opts, me->mnt_type, me->mnt_passno, false, false);
1578
1579 free(what);
1580 free(where);
1581
1582 if (k < 0)
1583 r = k;
1584 }
1585
1586 finish:
1587
1588 endmntent(f);
1589 return r;
1590 }
1591
1592 static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
1593 int r = 0;
1594 unsigned i;
1595 char *device, *path, *options, *options2, *fstype, *d, *p, *o;
1596
1597 assert(m);
1598
1599 rewind(m->proc_self_mountinfo);
1600
1601 for (i = 1;; i++) {
1602 int k;
1603
1604 device = path = options = options2 = fstype = d = p = o = NULL;
1605
1606 if ((k = fscanf(m->proc_self_mountinfo,
1607 "%*s " /* (1) mount id */
1608 "%*s " /* (2) parent id */
1609 "%*s " /* (3) major:minor */
1610 "%*s " /* (4) root */
1611 "%ms " /* (5) mount point */
1612 "%ms" /* (6) mount options */
1613 "%*[^-]" /* (7) optional fields */
1614 "- " /* (8) separator */
1615 "%ms " /* (9) file system type */
1616 "%ms" /* (10) mount source */
1617 "%ms" /* (11) mount options 2 */
1618 "%*[^\n]", /* some rubbish at the end */
1619 &path,
1620 &options,
1621 &fstype,
1622 &device,
1623 &options2)) != 5) {
1624
1625 if (k == EOF)
1626 break;
1627
1628 log_warning("Failed to parse /proc/self/mountinfo:%u.", i);
1629 goto clean_up;
1630 }
1631
1632 if (asprintf(&o, "%s,%s", options, options2) < 0) {
1633 r = -ENOMEM;
1634 goto finish;
1635 }
1636
1637 if (!(d = cunescape(device)) ||
1638 !(p = cunescape(path))) {
1639 r = -ENOMEM;
1640 goto finish;
1641 }
1642
1643 if ((k = mount_add_one(m, d, p, o, fstype, 0, true, set_flags)) < 0)
1644 r = k;
1645
1646 clean_up:
1647 free(device);
1648 free(path);
1649 free(options);
1650 free(options2);
1651 free(fstype);
1652 free(d);
1653 free(p);
1654 free(o);
1655 }
1656
1657 finish:
1658 free(device);
1659 free(path);
1660 free(options);
1661 free(options2);
1662 free(fstype);
1663 free(d);
1664 free(p);
1665 free(o);
1666
1667 return r;
1668 }
1669
1670 static void mount_shutdown(Manager *m) {
1671 assert(m);
1672
1673 if (m->proc_self_mountinfo) {
1674 fclose(m->proc_self_mountinfo);
1675 m->proc_self_mountinfo = NULL;
1676 }
1677 }
1678
1679 static int mount_enumerate(Manager *m) {
1680 int r;
1681 struct epoll_event ev;
1682 assert(m);
1683
1684 if (!m->proc_self_mountinfo) {
1685 if (!(m->proc_self_mountinfo = fopen("/proc/self/mountinfo", "re")))
1686 return -errno;
1687
1688 m->mount_watch.type = WATCH_MOUNT;
1689 m->mount_watch.fd = fileno(m->proc_self_mountinfo);
1690
1691 zero(ev);
1692 ev.events = EPOLLPRI;
1693 ev.data.ptr = &m->mount_watch;
1694
1695 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->mount_watch.fd, &ev) < 0)
1696 return -errno;
1697 }
1698
1699 if ((r = mount_load_etc_fstab(m)) < 0)
1700 goto fail;
1701
1702 if ((r = mount_load_proc_self_mountinfo(m, false)) < 0)
1703 goto fail;
1704
1705 return 0;
1706
1707 fail:
1708 mount_shutdown(m);
1709 return r;
1710 }
1711
1712 void mount_fd_event(Manager *m, int events) {
1713 Unit *u;
1714 int r;
1715
1716 assert(m);
1717 assert(events & EPOLLPRI);
1718
1719 /* The manager calls this for every fd event happening on the
1720 * /proc/self/mountinfo file, which informs us about mounting
1721 * table changes */
1722
1723 if ((r = mount_load_proc_self_mountinfo(m, true)) < 0) {
1724 log_error("Failed to reread /proc/self/mountinfo: %s", strerror(-r));
1725
1726 /* Reset flags, just in case, for later calls */
1727 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1728 Mount *mount = MOUNT(u);
1729
1730 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1731 }
1732
1733 return;
1734 }
1735
1736 manager_dispatch_load_queue(m);
1737
1738 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1739 Mount *mount = MOUNT(u);
1740
1741 if (!mount->is_mounted) {
1742 /* This has just been unmounted. */
1743
1744 mount->from_proc_self_mountinfo = false;
1745
1746 switch (mount->state) {
1747
1748 case MOUNT_MOUNTED:
1749 mount_enter_dead(mount, MOUNT_SUCCESS);
1750 break;
1751
1752 default:
1753 mount_set_state(mount, mount->state);
1754 break;
1755
1756 }
1757
1758 } else if (mount->just_mounted || mount->just_changed) {
1759
1760 /* New or changed mount entry */
1761
1762 switch (mount->state) {
1763
1764 case MOUNT_DEAD:
1765 case MOUNT_FAILED:
1766 mount_enter_mounted(mount, MOUNT_SUCCESS);
1767 break;
1768
1769 case MOUNT_MOUNTING:
1770 mount_enter_mounting_done(mount);
1771 break;
1772
1773 default:
1774 /* Nothing really changed, but let's
1775 * issue an notification call
1776 * nonetheless, in case somebody is
1777 * waiting for this. (e.g. file system
1778 * ro/rw remounts.) */
1779 mount_set_state(mount, mount->state);
1780 break;
1781 }
1782 }
1783
1784 /* Reset the flags for later calls */
1785 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1786 }
1787 }
1788
1789 static void mount_reset_failed(Unit *u) {
1790 Mount *m = MOUNT(u);
1791
1792 assert(m);
1793
1794 if (m->state == MOUNT_FAILED)
1795 mount_set_state(m, MOUNT_DEAD);
1796
1797 m->result = MOUNT_SUCCESS;
1798 m->reload_result = MOUNT_SUCCESS;
1799 }
1800
1801 static int mount_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError *error) {
1802 Mount *m = MOUNT(u);
1803 int r = 0;
1804 Set *pid_set = NULL;
1805
1806 assert(m);
1807
1808 if (who == KILL_MAIN) {
1809 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "Mount units have no main processes");
1810 return -ESRCH;
1811 }
1812
1813 if (m->control_pid <= 0 && who == KILL_CONTROL) {
1814 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
1815 return -ESRCH;
1816 }
1817
1818 if (who == KILL_CONTROL || who == KILL_ALL)
1819 if (m->control_pid > 0)
1820 if (kill(m->control_pid, signo) < 0)
1821 r = -errno;
1822
1823 if (who == KILL_ALL && mode == KILL_CONTROL_GROUP) {
1824 int q;
1825
1826 if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func)))
1827 return -ENOMEM;
1828
1829 /* Exclude the control pid from being killed via the cgroup */
1830 if (m->control_pid > 0)
1831 if ((q = set_put(pid_set, LONG_TO_PTR(m->control_pid))) < 0) {
1832 r = q;
1833 goto finish;
1834 }
1835
1836 if ((q = cgroup_bonding_kill_list(UNIT(m)->cgroup_bondings, signo, false, pid_set)) < 0)
1837 if (q != -EAGAIN && q != -ESRCH && q != -ENOENT)
1838 r = q;
1839 }
1840
1841 finish:
1842 if (pid_set)
1843 set_free(pid_set);
1844
1845 return r;
1846 }
1847
1848 static const char* const mount_state_table[_MOUNT_STATE_MAX] = {
1849 [MOUNT_DEAD] = "dead",
1850 [MOUNT_MOUNTING] = "mounting",
1851 [MOUNT_MOUNTING_DONE] = "mounting-done",
1852 [MOUNT_MOUNTED] = "mounted",
1853 [MOUNT_REMOUNTING] = "remounting",
1854 [MOUNT_UNMOUNTING] = "unmounting",
1855 [MOUNT_MOUNTING_SIGTERM] = "mounting-sigterm",
1856 [MOUNT_MOUNTING_SIGKILL] = "mounting-sigkill",
1857 [MOUNT_REMOUNTING_SIGTERM] = "remounting-sigterm",
1858 [MOUNT_REMOUNTING_SIGKILL] = "remounting-sigkill",
1859 [MOUNT_UNMOUNTING_SIGTERM] = "unmounting-sigterm",
1860 [MOUNT_UNMOUNTING_SIGKILL] = "unmounting-sigkill",
1861 [MOUNT_FAILED] = "failed"
1862 };
1863
1864 DEFINE_STRING_TABLE_LOOKUP(mount_state, MountState);
1865
1866 static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = {
1867 [MOUNT_EXEC_MOUNT] = "ExecMount",
1868 [MOUNT_EXEC_UNMOUNT] = "ExecUnmount",
1869 [MOUNT_EXEC_REMOUNT] = "ExecRemount",
1870 };
1871
1872 DEFINE_STRING_TABLE_LOOKUP(mount_exec_command, MountExecCommand);
1873
1874 static const char* const mount_result_table[_MOUNT_RESULT_MAX] = {
1875 [MOUNT_SUCCESS] = "success",
1876 [MOUNT_FAILURE_RESOURCES] = "resources",
1877 [MOUNT_FAILURE_TIMEOUT] = "timeout",
1878 [MOUNT_FAILURE_EXIT_CODE] = "exit-code",
1879 [MOUNT_FAILURE_SIGNAL] = "signal",
1880 [MOUNT_FAILURE_CORE_DUMP] = "core-dump"
1881 };
1882
1883 DEFINE_STRING_TABLE_LOOKUP(mount_result, MountResult);
1884
1885 const UnitVTable mount_vtable = {
1886 .suffix = ".mount",
1887 .object_size = sizeof(Mount),
1888 .sections =
1889 "Unit\0"
1890 "Mount\0"
1891 "Install\0",
1892
1893 .no_alias = true,
1894 .no_instances = true,
1895 .show_status = true,
1896
1897 .init = mount_init,
1898 .load = mount_load,
1899 .done = mount_done,
1900
1901 .coldplug = mount_coldplug,
1902
1903 .dump = mount_dump,
1904
1905 .start = mount_start,
1906 .stop = mount_stop,
1907 .reload = mount_reload,
1908
1909 .kill = mount_kill,
1910
1911 .serialize = mount_serialize,
1912 .deserialize_item = mount_deserialize_item,
1913
1914 .active_state = mount_active_state,
1915 .sub_state_to_string = mount_sub_state_to_string,
1916
1917 .check_gc = mount_check_gc,
1918
1919 .sigchld_event = mount_sigchld_event,
1920 .timer_event = mount_timer_event,
1921
1922 .reset_failed = mount_reset_failed,
1923
1924 .bus_interface = "org.freedesktop.systemd1.Mount",
1925 .bus_message_handler = bus_mount_message_handler,
1926 .bus_invalidating_properties = bus_mount_invalidating_properties,
1927
1928 .enumerate = mount_enumerate,
1929 .shutdown = mount_shutdown
1930 };