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