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