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