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