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