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