]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/mount.c
fs-util: chase_symlinks(): support empty root
[thirdparty/systemd.git] / src / core / mount.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
a7334b09
LP
2/***
3 This file is part of systemd.
4
5 Copyright 2010 Lennart Poettering
6
7 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
10 (at your option) any later version.
11
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 15 Lesser General Public License for more details.
a7334b09 16
5430f7f2 17 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
19***/
20
5cb5a6ff 21#include <errno.h>
4f5dd394 22#include <signal.h>
b08d03ff 23#include <stdio.h>
ef734fd6 24#include <sys/epoll.h>
5cb5a6ff 25
20ad4cfd 26#include "sd-messages.h"
4f5dd394 27
b5efdb8a 28#include "alloc-util.h"
4139c1b2 29#include "dbus-mount.h"
4f5dd394 30#include "escape.h"
9a57c629 31#include "exit-status.h"
f97b34a6 32#include "format-util.h"
4f5dd394
LP
33#include "fstab-util.h"
34#include "log.h"
35#include "manager.h"
36#include "mkdir.h"
37#include "mount-setup.h"
4e036b7a 38#include "mount-util.h"
4f5dd394 39#include "mount.h"
6bedfcbb 40#include "parse-util.h"
4f5dd394 41#include "path-util.h"
7b3e062c 42#include "process-util.h"
4f5dd394 43#include "special.h"
8b43440b 44#include "string-table.h"
b5efdb8a 45#include "string-util.h"
4f5dd394
LP
46#include "strv.h"
47#include "unit-name.h"
48#include "unit.h"
5cb5a6ff 49
7d54a03a
LP
50#define RETRY_UMOUNT_MAX 32
51
4e920142
ZJS
52DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_table*, mnt_free_table);
53DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_iter*, mnt_free_iter);
54
f50e0a01
LP
55static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = {
56 [MOUNT_DEAD] = UNIT_INACTIVE,
57 [MOUNT_MOUNTING] = UNIT_ACTIVATING,
e537352b 58 [MOUNT_MOUNTING_DONE] = UNIT_ACTIVE,
f50e0a01 59 [MOUNT_MOUNTED] = UNIT_ACTIVE,
032ff4af 60 [MOUNT_REMOUNTING] = UNIT_RELOADING,
f50e0a01 61 [MOUNT_UNMOUNTING] = UNIT_DEACTIVATING,
032ff4af
LP
62 [MOUNT_REMOUNTING_SIGTERM] = UNIT_RELOADING,
63 [MOUNT_REMOUNTING_SIGKILL] = UNIT_RELOADING,
e537352b
LP
64 [MOUNT_UNMOUNTING_SIGTERM] = UNIT_DEACTIVATING,
65 [MOUNT_UNMOUNTING_SIGKILL] = UNIT_DEACTIVATING,
fdf20a31 66 [MOUNT_FAILED] = UNIT_FAILED
f50e0a01 67};
5cb5a6ff 68
718db961
LP
69static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata);
70static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
71
c634f3d2
LP
72static bool MOUNT_STATE_WITH_PROCESS(MountState state) {
73 return IN_SET(state,
74 MOUNT_MOUNTING,
75 MOUNT_MOUNTING_DONE,
76 MOUNT_REMOUNTING,
77 MOUNT_REMOUNTING_SIGTERM,
78 MOUNT_REMOUNTING_SIGKILL,
79 MOUNT_UNMOUNTING,
80 MOUNT_UNMOUNTING_SIGTERM,
81 MOUNT_UNMOUNTING_SIGKILL);
82}
83
affc3d83 84static bool mount_needs_network(const char *options, const char *fstype) {
d15d0333 85 if (fstab_test_option(options, "_netdev\0"))
fc676b00
ZJS
86 return true;
87
affc3d83 88 if (fstype && fstype_is_network(fstype))
fc676b00
ZJS
89 return true;
90
91 return false;
92}
93
e6a7b9f4 94static bool mount_is_network(const MountParameters *p) {
affc3d83
CL
95 assert(p);
96
97 return mount_needs_network(p->options, p->fstype);
98}
99
d3bd0986
MK
100static bool mount_is_loop(const MountParameters *p) {
101 assert(p);
102
103 if (fstab_test_option(p->options, "loop\0"))
104 return true;
105
106 return false;
107}
108
e6a7b9f4 109static bool mount_is_bind(const MountParameters *p) {
fc676b00
ZJS
110 assert(p);
111
d15d0333 112 if (fstab_test_option(p->options, "bind\0" "rbind\0"))
fc676b00
ZJS
113 return true;
114
d15d0333 115 if (p->fstype && STR_IN_SET(p->fstype, "bind", "rbind"))
fc676b00
ZJS
116 return true;
117
118 return false;
119}
120
e6a7b9f4 121static bool mount_is_auto(const MountParameters *p) {
fc676b00
ZJS
122 assert(p);
123
d15d0333 124 return !fstab_test_option(p->options, "noauto\0");
fc676b00
ZJS
125}
126
2b14df4a
FB
127static bool mount_is_automount(const MountParameters *p) {
128 assert(p);
129
130 return fstab_test_option(p->options,
131 "comment=systemd.automount\0"
132 "x-systemd.automount\0");
133}
134
ebc8968b
FB
135static bool mount_is_bound_to_device(const Mount *m) {
136 const MountParameters *p;
137
138 if (m->from_fragment)
139 return true;
140
141 p = &m->parameters_proc_self_mountinfo;
142 return fstab_test_option(p->options, "x-systemd.device-bound\0");
143}
144
e6a7b9f4 145static bool needs_quota(const MountParameters *p) {
fc676b00
ZJS
146 assert(p);
147
11041c84 148 /* Quotas are not enabled on network filesystems,
340a1d23 149 * but we want them, for example, on storage connected via iscsi */
11041c84 150 if (p->fstype && fstype_is_network(p->fstype))
fc676b00
ZJS
151 return false;
152
153 if (mount_is_bind(p))
154 return false;
155
d15d0333
ZJS
156 return fstab_test_option(p->options,
157 "usrquota\0" "grpquota\0" "quota\0" "usrjquota\0" "grpjquota\0");
fc676b00
ZJS
158}
159
a16e1123
LP
160static void mount_init(Unit *u) {
161 Mount *m = MOUNT(u);
5cb5a6ff 162
a16e1123 163 assert(u);
ac155bb8 164 assert(u->load_state == UNIT_STUB);
a16e1123 165
1f19a534 166 m->timeout_usec = u->manager->default_timeout_start_usec;
5804e1b6
AJ
167
168 m->exec_context.std_output = u->manager->default_std_output;
169 m->exec_context.std_error = u->manager->default_std_error;
170
3e5235b0
LP
171 m->directory_mode = 0755;
172
f00929ad
DJL
173 /* We need to make sure that /usr/bin/mount is always called
174 * in the same process group as us, so that the autofs kernel
a16e1123
LP
175 * side doesn't send us another mount request while we are
176 * already trying to comply its last one. */
74922904 177 m->exec_context.same_pgrp = true;
8d567588 178
a16e1123 179 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
c8f4d764 180
5bcb0f2b 181 u->ignore_on_isolate = true;
8d567588
LP
182}
183
36c16a7c 184static int mount_arm_timer(Mount *m, usec_t usec) {
718db961
LP
185 int r;
186
187 assert(m);
188
718db961 189 if (m->timer_event_source) {
36c16a7c 190 r = sd_event_source_set_time(m->timer_event_source, usec);
718db961
LP
191 if (r < 0)
192 return r;
193
194 return sd_event_source_set_enabled(m->timer_event_source, SD_EVENT_ONESHOT);
195 }
196
36c16a7c
LP
197 if (usec == USEC_INFINITY)
198 return 0;
199
7dfbe2e3 200 r = sd_event_add_time(
6a0f1f6d
LP
201 UNIT(m)->manager->event,
202 &m->timer_event_source,
203 CLOCK_MONOTONIC,
36c16a7c 204 usec, 0,
6a0f1f6d 205 mount_dispatch_timer, m);
7dfbe2e3
TG
206 if (r < 0)
207 return r;
208
209 (void) sd_event_source_set_description(m->timer_event_source, "mount-timer");
210
211 return 0;
718db961
LP
212}
213
a16e1123 214static void mount_unwatch_control_pid(Mount *m) {
5e94833f
LP
215 assert(m);
216
217 if (m->control_pid <= 0)
218 return;
219
220 unit_unwatch_pid(UNIT(m), m->control_pid);
221 m->control_pid = 0;
222}
223
e537352b
LP
224static void mount_parameters_done(MountParameters *p) {
225 assert(p);
226
227 free(p->what);
228 free(p->options);
229 free(p->fstype);
230
231 p->what = p->options = p->fstype = NULL;
232}
233
87f0e418 234static void mount_done(Unit *u) {
ef734fd6 235 Mount *m = MOUNT(u);
034c6ed7 236
ef734fd6 237 assert(m);
034c6ed7 238
a1e58e8e 239 m->where = mfree(m->where);
f50e0a01 240
e537352b
LP
241 mount_parameters_done(&m->parameters_proc_self_mountinfo);
242 mount_parameters_done(&m->parameters_fragment);
ef734fd6 243
613b411c 244 m->exec_runtime = exec_runtime_unref(m->exec_runtime);
e537352b
LP
245 exec_command_done_array(m->exec_command, _MOUNT_EXEC_COMMAND_MAX);
246 m->control_command = NULL;
f50e0a01 247
29206d46
LP
248 dynamic_creds_unref(&m->dynamic_creds);
249
a16e1123 250 mount_unwatch_control_pid(m);
f50e0a01 251
718db961 252 m->timer_event_source = sd_event_source_unref(m->timer_event_source);
f50e0a01
LP
253}
254
44a6b1b6 255_pure_ static MountParameters* get_mount_parameters_fragment(Mount *m) {
cb39ed3f
LP
256 assert(m);
257
258 if (m->from_fragment)
259 return &m->parameters_fragment;
cb39ed3f
LP
260
261 return NULL;
262}
263
44a6b1b6 264_pure_ static MountParameters* get_mount_parameters(Mount *m) {
cb39ed3f
LP
265 assert(m);
266
267 if (m->from_proc_self_mountinfo)
268 return &m->parameters_proc_self_mountinfo;
269
6b1dc2bd 270 return get_mount_parameters_fragment(m);
cb39ed3f
LP
271}
272
eef85c4a 273static int mount_add_mount_dependencies(Mount *m) {
5c78d8e2 274 MountParameters *pm;
ac155bb8 275 Unit *other;
a57f7e2c
LP
276 Iterator i;
277 Set *s;
b08d03ff
LP
278 int r;
279
6e2ef85b 280 assert(m);
b08d03ff 281
a57f7e2c 282 if (!path_equal(m->where, "/")) {
eef85c4a
LP
283 _cleanup_free_ char *parent = NULL;
284
285 /* Adds in links to other mount points that might lie further up in the hierarchy */
5f311f8c
LP
286
287 parent = dirname_malloc(m->where);
288 if (!parent)
289 return -ENOMEM;
01f78473 290
eef85c4a 291 r = unit_require_mounts_for(UNIT(m), parent, UNIT_DEPENDENCY_IMPLICIT);
4f0eedb7 292 if (r < 0)
01f78473 293 return r;
4f0eedb7 294 }
01f78473 295
eef85c4a
LP
296 /* Adds in dependencies to other mount points that might be needed for the source path (if this is a bind mount
297 * or a loop mount) to be available. */
a57f7e2c 298 pm = get_mount_parameters_fragment(m);
fc676b00
ZJS
299 if (pm && pm->what &&
300 path_is_absolute(pm->what) &&
d3bd0986 301 (mount_is_bind(pm) || mount_is_loop(pm) || !mount_is_network(pm))) {
fc676b00 302
eef85c4a 303 r = unit_require_mounts_for(UNIT(m), pm->what, UNIT_DEPENDENCY_FILE);
4f0eedb7 304 if (r < 0)
6e2ef85b 305 return r;
4f0eedb7 306 }
b08d03ff 307
eef85c4a 308 /* Adds in dependencies to other units that use this path or paths further down in the hierarchy */
a57f7e2c
LP
309 s = manager_get_units_requiring_mounts_for(UNIT(m)->manager, m->where);
310 SET_FOREACH(other, s, i) {
b08d03ff 311
a57f7e2c
LP
312 if (other->load_state != UNIT_LOADED)
313 continue;
b08d03ff 314
a57f7e2c
LP
315 if (other == UNIT(m))
316 continue;
b08d03ff 317
eef85c4a 318 r = unit_add_dependency(other, UNIT_AFTER, UNIT(m), true, UNIT_DEPENDENCY_PATH);
4f0eedb7 319 if (r < 0)
6e2ef85b 320 return r;
b08d03ff 321
a57f7e2c
LP
322 if (UNIT(m)->fragment_path) {
323 /* If we have fragment configuration, then make this dependency required */
eef85c4a 324 r = unit_add_dependency(other, UNIT_REQUIRES, UNIT(m), true, UNIT_DEPENDENCY_PATH);
a57f7e2c
LP
325 if (r < 0)
326 return r;
327 }
7c8fa05c
LP
328 }
329
330 return 0;
331}
332
eef85c4a 333static int mount_add_device_dependencies(Mount *m) {
5073f89f 334 bool device_wants_mount = false;
eef85c4a
LP
335 UnitDependencyMask mask;
336 MountParameters *p;
ebc8968b 337 UnitDependency dep;
9fff8a1f 338 int r;
173a8d04
LP
339
340 assert(m);
341
06e97888 342 p = get_mount_parameters(m);
6b1dc2bd 343 if (!p)
173a8d04
LP
344 return 0;
345
9fff8a1f 346 if (!p->what)
173a8d04 347 return 0;
5c78d8e2 348
dd144c63
LP
349 if (mount_is_bind(p))
350 return 0;
351
352 if (!is_device_path(p->what))
353 return 0;
354
7ba2711d
LP
355 /* /dev/root is a really weird thing, it's not a real device,
356 * but just a path the kernel exports for the root file system
357 * specified on the kernel command line. Ignore it here. */
358 if (path_equal(p->what, "/dev/root"))
359 return 0;
360
dd144c63
LP
361 if (path_equal(m->where, "/"))
362 return 0;
363
463d0d15 364 if (mount_is_auto(p) && !mount_is_automount(p) && MANAGER_IS_SYSTEM(UNIT(m)->manager))
5073f89f
TG
365 device_wants_mount = true;
366
ebc8968b
FB
367 /* Mount units from /proc/self/mountinfo are not bound to devices
368 * by default since they're subject to races when devices are
369 * unplugged. But the user can still force this dep with an
370 * appropriate option (or udev property) so the mount units are
371 * automatically stopped when the device disappears suddenly. */
372 dep = mount_is_bound_to_device(m) ? UNIT_BINDS_TO : UNIT_REQUIRES;
373
eef85c4a
LP
374 mask = m->from_fragment ? UNIT_DEPENDENCY_FILE : UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT;
375
376 r = unit_add_node_dependency(UNIT(m), p->what, device_wants_mount, dep, mask);
dd144c63
LP
377 if (r < 0)
378 return r;
9fff8a1f 379
9fff8a1f 380 return 0;
173a8d04
LP
381}
382
eef85c4a
LP
383static int mount_add_quota_dependencies(Mount *m) {
384 UnitDependencyMask mask;
6b1dc2bd 385 MountParameters *p;
eef85c4a 386 int r;
6b1dc2bd
LP
387
388 assert(m);
389
463d0d15 390 if (!MANAGER_IS_SYSTEM(UNIT(m)->manager))
6b1dc2bd
LP
391 return 0;
392
393 p = get_mount_parameters_fragment(m);
394 if (!p)
395 return 0;
396
397 if (!needs_quota(p))
398 return 0;
399
eef85c4a
LP
400 mask = m->from_fragment ? UNIT_DEPENDENCY_FILE : UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT;
401
402 r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTACHECK_SERVICE, NULL, true, mask);
6b1dc2bd
LP
403 if (r < 0)
404 return r;
405
eef85c4a 406 r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTAON_SERVICE, NULL, true, mask);
6b1dc2bd
LP
407 if (r < 0)
408 return r;
409
410 return 0;
411}
412
ad2706db 413static bool mount_is_extrinsic(Mount *m) {
88ac30a1 414 MountParameters *p;
ad2706db 415 assert(m);
88ac30a1 416
ad2706db
LP
417 /* Returns true for all units that are "magic" and should be excluded from the usual start-up and shutdown
418 * dependencies. We call them "extrinsic" here, as they are generally mounted outside of the systemd dependency
419 * logic. We shouldn't attempt to manage them ourselves but it's fine if the user operates on them with us. */
420
421 if (!MANAGER_IS_SYSTEM(UNIT(m)->manager)) /* We only automatically manage mounts if we are in system mode */
422 return true;
423
424 if (PATH_IN_SET(m->where, /* Don't bother with the OS data itself */
425 "/",
426 "/usr"))
427 return true;
88ac30a1 428
ad2706db
LP
429 if (PATH_STARTSWITH_SET(m->where,
430 "/run/initramfs", /* This should stay around from before we boot until after we shutdown */
431 "/proc", /* All of this is API VFS */
432 "/sys", /* … dito … */
433 "/dev")) /* … dito … */
434 return true;
435
436 /* If this is an initrd mount, and we are not in the initrd, then leave this around forever, too. */
88ac30a1 437 p = get_mount_parameters(m);
ad2706db
LP
438 if (p && fstab_test_option(p->options, "x-initrd.mount\0") && !in_initrd())
439 return true;
88ac30a1 440
ad2706db 441 return false;
88ac30a1
TG
442}
443
2edd4434 444static int mount_add_default_dependencies(Mount *m) {
eef85c4a
LP
445 UnitDependencyMask mask;
446 int r;
9ddc4a26 447 MountParameters *p;
ea0ec5ce 448 const char *after;
2edd4434
LP
449
450 assert(m);
451
4c9ea260
LP
452 if (!UNIT(m)->default_dependencies)
453 return 0;
454
ad2706db
LP
455 /* We do not add any default dependencies to /, /usr or /run/initramfs/, since they are guaranteed to stay
456 * mounted the whole time, since our system is on it. Also, don't bother with anything mounted below virtual
457 * file systems, it's also going to be virtual, and hence not worth the effort. */
458 if (mount_is_extrinsic(m))
6b1dc2bd 459 return 0;
2edd4434 460
874d3404
LP
461 p = get_mount_parameters(m);
462 if (!p)
6b1dc2bd
LP
463 return 0;
464
eef85c4a
LP
465 mask = m->from_fragment ? UNIT_DEPENDENCY_FILE : UNIT_DEPENDENCY_MOUNTINFO_DEFAULT;
466
e8d2f6cd 467 if (mount_is_network(p)) {
ea0ec5ce
LP
468 /* We order ourselves after network.target. This is
469 * primarily useful at shutdown: services that take
470 * down the network should order themselves before
471 * network.target, so that they are shut down only
472 * after this mount unit is stopped. */
6b1dc2bd 473
eef85c4a 474 r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, SPECIAL_NETWORK_TARGET, NULL, true, mask);
a63a5c46
LP
475 if (r < 0)
476 return r;
a63a5c46 477
ea0ec5ce
LP
478 /* We pull in network-online.target, and order
479 * ourselves after it. This is useful at start-up to
480 * actively pull in tools that want to be started
481 * before we start mounting network file systems, and
482 * whose purpose it is to delay this until the network
483 * is "up". */
484
eef85c4a 485 r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_WANTS, UNIT_AFTER, SPECIAL_NETWORK_ONLINE_TARGET, NULL, true, mask);
e8d2f6cd
LP
486 if (r < 0)
487 return r;
ea0ec5ce
LP
488
489 after = SPECIAL_REMOTE_FS_PRE_TARGET;
490 } else
491 after = SPECIAL_LOCAL_FS_PRE_TARGET;
492
eef85c4a 493 r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, after, NULL, true, mask);
ea0ec5ce
LP
494 if (r < 0)
495 return r;
e8d2f6cd 496
eef85c4a 497 r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true, mask);
ad2706db
LP
498 if (r < 0)
499 return r;
2edd4434 500
3e3852b3 501 /* If this is a tmpfs mount then we have to unmount it before we try to deactivate swaps */
74b1731c 502 if (streq_ptr(p->fstype, "tmpfs")) {
3e3852b3
LP
503 r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, SPECIAL_SWAP_TARGET, NULL, true, mask);
504 if (r < 0)
505 return r;
506 }
507
2edd4434
LP
508 return 0;
509}
510
8d567588 511static int mount_verify(Mount *m) {
a57f7e2c 512 _cleanup_free_ char *e = NULL;
b294b79f 513 MountParameters *p;
7410616c 514 int r;
a57f7e2c 515
8d567588
LP
516 assert(m);
517
1124fe6f 518 if (UNIT(m)->load_state != UNIT_LOADED)
8d567588
LP
519 return 0;
520
1df96fcb 521 if (!m->from_fragment && !m->from_proc_self_mountinfo && !UNIT(m)->perpetual)
8cbef760
LP
522 return -ENOENT;
523
7410616c
LP
524 r = unit_name_from_path(m->where, ".mount", &e);
525 if (r < 0)
f2341e0a 526 return log_unit_error_errno(UNIT(m), r, "Failed to generate unit name from mount path: %m");
8d567588 527
7410616c 528 if (!unit_has_name(UNIT(m), e)) {
f2341e0a 529 log_unit_error(UNIT(m), "Where= setting doesn't match unit name. Refusing.");
8d567588
LP
530 return -EINVAL;
531 }
532
33ff02c9 533 if (mount_point_is_api(m->where) || mount_point_ignore(m->where)) {
f2341e0a 534 log_unit_error(UNIT(m), "Cannot create mount unit for API file system %s. Refusing.", m->where);
33ff02c9
LP
535 return -EINVAL;
536 }
537
b294b79f
MO
538 p = get_mount_parameters_fragment(m);
539 if (p && !p->what) {
f2341e0a 540 log_unit_error(UNIT(m), "What= setting is missing. Refusing.");
4e85aff4
LP
541 return -EBADMSG;
542 }
543
4819ff03 544 if (m->exec_context.pam_name && m->kill_context.kill_mode != KILL_CONTROL_GROUP) {
f2341e0a 545 log_unit_error(UNIT(m), "Unit has PAM enabled. Kill mode must be set to control-group'. Refusing.");
4d0e5dbd
LP
546 return -EINVAL;
547 }
548
8d567588
LP
549 return 0;
550}
551
1a4ac875
MS
552static int mount_add_extras(Mount *m) {
553 Unit *u = UNIT(m);
e537352b
LP
554 int r;
555
e821075a
LP
556 assert(m);
557
558 if (u->fragment_path)
1a4ac875 559 m->from_fragment = true;
e537352b 560
1a4ac875 561 if (!m->where) {
7410616c
LP
562 r = unit_name_to_path(u->id, &m->where);
563 if (r < 0)
564 return r;
1a4ac875 565 }
a16e1123 566
1a4ac875 567 path_kill_slashes(m->where);
e537352b 568
e821075a 569 if (!u->description) {
1a4ac875
MS
570 r = unit_set_description(u, m->where);
571 if (r < 0)
173a8d04 572 return r;
1a4ac875 573 }
6e2ef85b 574
eef85c4a 575 r = mount_add_device_dependencies(m);
1a4ac875
MS
576 if (r < 0)
577 return r;
6e2ef85b 578
eef85c4a 579 r = mount_add_mount_dependencies(m);
1a4ac875
MS
580 if (r < 0)
581 return r;
6e2ef85b 582
eef85c4a 583 r = mount_add_quota_dependencies(m);
1a4ac875
MS
584 if (r < 0)
585 return r;
e537352b 586
598459ce
LP
587 r = unit_patch_contexts(u);
588 if (r < 0)
589 return r;
4e67ddd6 590
598459ce 591 r = unit_add_exec_dependencies(u, &m->exec_context);
a016b922
LP
592 if (r < 0)
593 return r;
594
d79200e2 595 r = unit_set_default_slice(u);
1a4ac875
MS
596 if (r < 0)
597 return r;
598
4c9ea260
LP
599 r = mount_add_default_dependencies(m);
600 if (r < 0)
601 return r;
598459ce 602
1a4ac875
MS
603 return 0;
604}
605
11222d0f
LP
606static int mount_load_root_mount(Unit *u) {
607 assert(u);
608
609 if (!unit_has_name(u, SPECIAL_ROOT_MOUNT))
610 return 0;
611
612 u->perpetual = true;
613 u->default_dependencies = false;
614
615 /* The stdio/kmsg bridge socket is on /, in order to avoid a dep loop, don't use kmsg logging for -.mount */
616 MOUNT(u)->exec_context.std_output = EXEC_OUTPUT_NULL;
617 MOUNT(u)->exec_context.std_input = EXEC_INPUT_NULL;
618
619 if (!u->description)
620 u->description = strdup("Root Mount");
621
622 return 1;
623}
624
1a4ac875
MS
625static int mount_load(Unit *u) {
626 Mount *m = MOUNT(u);
627 int r;
628
629 assert(u);
630 assert(u->load_state == UNIT_STUB);
631
11222d0f
LP
632 r = mount_load_root_mount(u);
633 if (r < 0)
634 return r;
635
636 if (m->from_proc_self_mountinfo || u->perpetual)
8eba616f
MS
637 r = unit_load_fragment_and_dropin_optional(u);
638 else
639 r = unit_load_fragment_and_dropin(u);
1a4ac875
MS
640 if (r < 0)
641 return r;
155da457 642
1a4ac875
MS
643 /* This is a new unit? Then let's add in some extras */
644 if (u->load_state == UNIT_LOADED) {
645 r = mount_add_extras(m);
646 if (r < 0)
647 return r;
e537352b
LP
648 }
649
8d567588 650 return mount_verify(m);
e537352b
LP
651}
652
653static void mount_set_state(Mount *m, MountState state) {
654 MountState old_state;
655 assert(m);
656
657 old_state = m->state;
658 m->state = state;
659
c634f3d2 660 if (!MOUNT_STATE_WITH_PROCESS(state)) {
718db961 661 m->timer_event_source = sd_event_source_unref(m->timer_event_source);
a16e1123 662 mount_unwatch_control_pid(m);
e537352b 663 m->control_command = NULL;
a16e1123 664 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
e537352b
LP
665 }
666
667 if (state != old_state)
f2341e0a 668 log_unit_debug(UNIT(m), "Changed %s -> %s", mount_state_to_string(old_state), mount_state_to_string(state));
e537352b 669
9d2f5178 670 unit_notify(UNIT(m), state_translation_table[old_state], state_translation_table[state], m->reload_result == MOUNT_SUCCESS);
e537352b
LP
671}
672
be847e82 673static int mount_coldplug(Unit *u) {
e537352b 674 Mount *m = MOUNT(u);
a16e1123
LP
675 MountState new_state = MOUNT_DEAD;
676 int r;
e537352b
LP
677
678 assert(m);
679 assert(m->state == MOUNT_DEAD);
680
a16e1123
LP
681 if (m->deserialized_state != m->state)
682 new_state = m->deserialized_state;
683 else if (m->from_proc_self_mountinfo)
684 new_state = MOUNT_MOUNTED;
e537352b 685
5bcb0f2b
LP
686 if (new_state == m->state)
687 return 0;
e537352b 688
c386f588
LP
689 if (m->control_pid > 0 &&
690 pid_is_unwaited(m->control_pid) &&
c634f3d2 691 MOUNT_STATE_WITH_PROCESS(new_state)) {
5bcb0f2b
LP
692
693 r = unit_watch_pid(UNIT(m), m->control_pid);
694 if (r < 0)
695 return r;
e537352b 696
36c16a7c 697 r = mount_arm_timer(m, usec_add(u->state_change_timestamp.monotonic, m->timeout_usec));
5bcb0f2b
LP
698 if (r < 0)
699 return r;
a16e1123 700 }
e537352b 701
29206d46
LP
702 if (!IN_SET(new_state, MOUNT_DEAD, MOUNT_FAILED))
703 (void) unit_setup_dynamic_creds(u);
704
5bcb0f2b 705 mount_set_state(m, new_state);
e537352b 706 return 0;
e537352b
LP
707}
708
709static void mount_dump(Unit *u, FILE *f, const char *prefix) {
710 Mount *m = MOUNT(u);
711 MountParameters *p;
712
713 assert(m);
714 assert(f);
715
cb39ed3f 716 p = get_mount_parameters(m);
e537352b
LP
717
718 fprintf(f,
719 "%sMount State: %s\n"
81a5c6d0 720 "%sResult: %s\n"
e537352b
LP
721 "%sWhere: %s\n"
722 "%sWhat: %s\n"
723 "%sFile System Type: %s\n"
724 "%sOptions: %s\n"
e537352b
LP
725 "%sFrom /proc/self/mountinfo: %s\n"
726 "%sFrom fragment: %s\n"
ad2706db 727 "%sExtrinsic: %s\n"
e520950a 728 "%sDirectoryMode: %04o\n"
49915de2 729 "%sSloppyOptions: %s\n"
4f8d40a9
BR
730 "%sLazyUnmount: %s\n"
731 "%sForceUnmount: %s\n",
a16e1123 732 prefix, mount_state_to_string(m->state),
81a5c6d0 733 prefix, mount_result_to_string(m->result),
e537352b 734 prefix, m->where,
1e4fc9b1
HH
735 prefix, p ? strna(p->what) : "n/a",
736 prefix, p ? strna(p->fstype) : "n/a",
737 prefix, p ? strna(p->options) : "n/a",
e537352b
LP
738 prefix, yes_no(m->from_proc_self_mountinfo),
739 prefix, yes_no(m->from_fragment),
ad2706db 740 prefix, yes_no(mount_is_extrinsic(m)),
e520950a 741 prefix, m->directory_mode,
49915de2 742 prefix, yes_no(m->sloppy_options),
4f8d40a9
BR
743 prefix, yes_no(m->lazy_unmount),
744 prefix, yes_no(m->force_unmount));
e537352b
LP
745
746 if (m->control_pid > 0)
747 fprintf(f,
ccd06097
ZJS
748 "%sControl PID: "PID_FMT"\n",
749 prefix, m->control_pid);
e537352b
LP
750
751 exec_context_dump(&m->exec_context, f, prefix);
4819ff03 752 kill_context_dump(&m->kill_context, f, prefix);
18f573aa 753 cgroup_context_dump(&m->cgroup_context, f, prefix);
e537352b
LP
754}
755
a16e1123 756static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
3c7416b6 757
9fa95f85 758 ExecParameters exec_params = {
1703fa41 759 .flags = EXEC_APPLY_SANDBOXING|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN,
c39f1ce2
LP
760 .stdin_fd = -1,
761 .stdout_fd = -1,
762 .stderr_fd = -1,
9fa95f85 763 };
3c7416b6
LP
764 pid_t pid;
765 int r;
a16e1123
LP
766
767 assert(m);
768 assert(c);
769 assert(_pid);
770
3c7416b6 771 r = unit_prepare_exec(UNIT(m));
29206d46
LP
772 if (r < 0)
773 return r;
774
36c16a7c 775 r = mount_arm_timer(m, usec_add(now(CLOCK_MONOTONIC), m->timeout_usec));
36697dc0 776 if (r < 0)
36c16a7c 777 return r;
a16e1123 778
19bbdd98 779 manager_set_exec_params(UNIT(m)->manager, &exec_params);
f0d47797 780 unit_set_exec_params(UNIT(m), &exec_params);
9fa95f85 781
f2341e0a
LP
782 r = exec_spawn(UNIT(m),
783 c,
4ad49000 784 &m->exec_context,
9fa95f85 785 &exec_params,
613b411c 786 m->exec_runtime,
29206d46 787 &m->dynamic_creds,
4ad49000
LP
788 &pid);
789 if (r < 0)
36c16a7c 790 return r;
a16e1123 791
4ad49000
LP
792 r = unit_watch_pid(UNIT(m), pid);
793 if (r < 0)
a16e1123 794 /* FIXME: we need to do something here */
36c16a7c 795 return r;
a16e1123
LP
796
797 *_pid = pid;
798
799 return 0;
a16e1123
LP
800}
801
9d2f5178 802static void mount_enter_dead(Mount *m, MountResult f) {
e537352b
LP
803 assert(m);
804
a0fef983 805 if (m->result == MOUNT_SUCCESS)
9d2f5178 806 m->result = f;
e537352b 807
ed77d407
LP
808 if (m->result != MOUNT_SUCCESS)
809 log_unit_warning(UNIT(m), "Failed with result '%s'.", mount_result_to_string(m->result));
810
29206d46
LP
811 mount_set_state(m, m->result != MOUNT_SUCCESS ? MOUNT_FAILED : MOUNT_DEAD);
812
613b411c
LP
813 exec_runtime_destroy(m->exec_runtime);
814 m->exec_runtime = exec_runtime_unref(m->exec_runtime);
815
3536f49e 816 exec_context_destroy_runtime_directory(&m->exec_context, UNIT(m)->manager->prefix[EXEC_DIRECTORY_RUNTIME]);
e66cf1a3 817
00d9ef85
LP
818 unit_unref_uid_gid(UNIT(m), true);
819
29206d46 820 dynamic_creds_destroy(&m->dynamic_creds);
e537352b
LP
821}
822
9d2f5178 823static void mount_enter_mounted(Mount *m, MountResult f) {
80876c20
LP
824 assert(m);
825
a0fef983 826 if (m->result == MOUNT_SUCCESS)
9d2f5178 827 m->result = f;
80876c20
LP
828
829 mount_set_state(m, MOUNT_MOUNTED);
830}
831
22af0e58
LP
832static void mount_enter_dead_or_mounted(Mount *m, MountResult f) {
833 assert(m);
834
835 /* Enter DEAD or MOUNTED state, depending on what the kernel currently says about the mount point. We use this
836 * whenever we executed an operation, so that our internal state reflects what the kernel says again, after all
837 * ultimately we just mirror the kernel's internal state on this. */
838
839 if (m->from_proc_self_mountinfo)
840 mount_enter_mounted(m, f);
841 else
842 mount_enter_dead(m, f);
843}
844
845static int state_to_kill_operation(MountState state) {
846 switch (state) {
847
848 case MOUNT_REMOUNTING_SIGTERM:
849 case MOUNT_UNMOUNTING_SIGTERM:
850 return KILL_TERMINATE;
851
852 case MOUNT_REMOUNTING_SIGKILL:
853 case MOUNT_UNMOUNTING_SIGKILL:
854 return KILL_KILL;
855
856 default:
857 return _KILL_OPERATION_INVALID;
858 }
859}
860
9d2f5178 861static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
e537352b
LP
862 int r;
863
864 assert(m);
865
a0fef983 866 if (m->result == MOUNT_SUCCESS)
9d2f5178 867 m->result = f;
e537352b 868
cd2086fe
LP
869 r = unit_kill_context(
870 UNIT(m),
871 &m->kill_context,
22af0e58 872 state_to_kill_operation(state),
cd2086fe
LP
873 -1,
874 m->control_pid,
875 false);
876 if (r < 0)
877 goto fail;
e537352b 878
cd2086fe 879 if (r > 0) {
36c16a7c 880 r = mount_arm_timer(m, usec_add(now(CLOCK_MONOTONIC), m->timeout_usec));
36697dc0 881 if (r < 0)
80876c20 882 goto fail;
e537352b 883
80876c20 884 mount_set_state(m, state);
22af0e58 885 } else if (state == MOUNT_REMOUNTING_SIGTERM && m->kill_context.send_sigkill)
ac84d1fb 886 mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_SUCCESS);
22af0e58 887 else if (IN_SET(state, MOUNT_REMOUNTING_SIGTERM, MOUNT_REMOUNTING_SIGKILL))
9d2f5178 888 mount_enter_mounted(m, MOUNT_SUCCESS);
22af0e58 889 else if (state == MOUNT_UNMOUNTING_SIGTERM && m->kill_context.send_sigkill)
ac84d1fb 890 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_SUCCESS);
80876c20 891 else
22af0e58 892 mount_enter_dead_or_mounted(m, MOUNT_SUCCESS);
e537352b
LP
893
894 return;
895
896fail:
f2341e0a 897 log_unit_warning_errno(UNIT(m), r, "Failed to kill processes: %m");
22af0e58 898 mount_enter_dead_or_mounted(m, MOUNT_FAILURE_RESOURCES);
5261ba90
TT
899}
900
9d2f5178 901static void mount_enter_unmounting(Mount *m) {
e537352b
LP
902 int r;
903
904 assert(m);
905
7d54a03a
LP
906 /* Start counting our attempts */
907 if (!IN_SET(m->state,
908 MOUNT_UNMOUNTING,
909 MOUNT_UNMOUNTING_SIGTERM,
910 MOUNT_UNMOUNTING_SIGKILL))
911 m->n_retry_umount = 0;
912
a16e1123
LP
913 m->control_command_id = MOUNT_EXEC_UNMOUNT;
914 m->control_command = m->exec_command + MOUNT_EXEC_UNMOUNT;
e537352b 915
83897d54 916 r = exec_command_set(m->control_command, UMOUNT_PATH, m->where, "-c", NULL);
e520950a
BR
917 if (r >= 0 && m->lazy_unmount)
918 r = exec_command_append(m->control_command, "-l", NULL);
4f8d40a9
BR
919 if (r >= 0 && m->force_unmount)
920 r = exec_command_append(m->control_command, "-f", NULL);
7d54a03a 921 if (r < 0)
e537352b
LP
922 goto fail;
923
a16e1123 924 mount_unwatch_control_pid(m);
5e94833f 925
7d54a03a
LP
926 r = mount_spawn(m, m->control_command, &m->control_pid);
927 if (r < 0)
e537352b
LP
928 goto fail;
929
930 mount_set_state(m, MOUNT_UNMOUNTING);
931
932 return;
933
934fail:
f2341e0a 935 log_unit_warning_errno(UNIT(m), r, "Failed to run 'umount' task: %m");
22af0e58 936 mount_enter_dead_or_mounted(m, MOUNT_FAILURE_RESOURCES);
e537352b
LP
937}
938
8d567588 939static void mount_enter_mounting(Mount *m) {
e537352b 940 int r;
cb39ed3f 941 MountParameters *p;
e537352b
LP
942
943 assert(m);
944
f2341e0a
LP
945 r = unit_fail_if_symlink(UNIT(m), m->where);
946 if (r < 0)
947 goto fail;
948
949 (void) mkdir_p_label(m->where, m->directory_mode);
3e5235b0 950
f2341e0a 951 unit_warn_if_dir_nonempty(UNIT(m), m->where);
257f1d8e 952
a4634b21
LP
953 unit_warn_leftover_processes(UNIT(m));
954
955 m->control_command_id = MOUNT_EXEC_MOUNT;
956 m->control_command = m->exec_command + MOUNT_EXEC_MOUNT;
957
cb39ed3f 958 /* Create the source directory for bind-mounts if needed */
6b1dc2bd 959 p = get_mount_parameters_fragment(m);
cb39ed3f 960 if (p && mount_is_bind(p))
f2341e0a 961 (void) mkdir_p_label(p->what, m->directory_mode);
5261ba90 962
b294b79f 963 if (p) {
17a1c597
ZJS
964 _cleanup_free_ char *opts = NULL;
965
b294b79f 966 r = fstab_filter_options(p->options, "nofail\0" "noauto\0" "auto\0", NULL, NULL, &opts);
17a1c597
ZJS
967 if (r < 0)
968 goto fail;
969
b294b79f 970 r = exec_command_set(m->control_command, MOUNT_PATH, p->what, m->where, NULL);
e86b3761
ZJS
971 if (r >= 0 && m->sloppy_options)
972 r = exec_command_append(m->control_command, "-s", NULL);
b294b79f
MO
973 if (r >= 0 && p->fstype)
974 r = exec_command_append(m->control_command, "-t", p->fstype, NULL);
0c47569a 975 if (r >= 0 && !isempty(opts))
17a1c597 976 r = exec_command_append(m->control_command, "-o", opts, NULL);
e86b3761 977 } else
e537352b 978 r = -ENOENT;
e537352b
LP
979 if (r < 0)
980 goto fail;
981
a16e1123 982 mount_unwatch_control_pid(m);
5e94833f 983
257f1d8e
LP
984 r = mount_spawn(m, m->control_command, &m->control_pid);
985 if (r < 0)
e537352b
LP
986 goto fail;
987
988 mount_set_state(m, MOUNT_MOUNTING);
989
990 return;
991
992fail:
f2341e0a 993 log_unit_warning_errno(UNIT(m), r, "Failed to run 'mount' task: %m");
22af0e58 994 mount_enter_dead_or_mounted(m, MOUNT_FAILURE_RESOURCES);
e537352b
LP
995}
996
850b7410
LP
997static void mount_set_reload_result(Mount *m, MountResult result) {
998 assert(m);
999
1000 /* Only store the first error we encounter */
1001 if (m->reload_result != MOUNT_SUCCESS)
1002 return;
1003
1004 m->reload_result = result;
1005}
1006
9d2f5178 1007static void mount_enter_remounting(Mount *m) {
e537352b 1008 int r;
b294b79f 1009 MountParameters *p;
e537352b
LP
1010
1011 assert(m);
1012
850b7410
LP
1013 /* Reset reload result when we are about to start a new remount operation */
1014 m->reload_result = MOUNT_SUCCESS;
1015
a16e1123
LP
1016 m->control_command_id = MOUNT_EXEC_REMOUNT;
1017 m->control_command = m->exec_command + MOUNT_EXEC_REMOUNT;
e537352b 1018
b294b79f
MO
1019 p = get_mount_parameters_fragment(m);
1020 if (p) {
e537352b
LP
1021 const char *o;
1022
b294b79f
MO
1023 if (p->options)
1024 o = strjoina("remount,", p->options);
718db961 1025 else
e537352b
LP
1026 o = "remount";
1027
f00929ad 1028 r = exec_command_set(m->control_command, MOUNT_PATH,
b294b79f 1029 p->what, m->where,
e86b3761 1030 "-o", o, NULL);
e86b3761
ZJS
1031 if (r >= 0 && m->sloppy_options)
1032 r = exec_command_append(m->control_command, "-s", NULL);
b294b79f
MO
1033 if (r >= 0 && p->fstype)
1034 r = exec_command_append(m->control_command, "-t", p->fstype, NULL);
6b1dc2bd 1035 } else
e537352b 1036 r = -ENOENT;
60b912f6 1037 if (r < 0)
e537352b 1038 goto fail;
e537352b 1039
a16e1123 1040 mount_unwatch_control_pid(m);
5e94833f 1041
718db961
LP
1042 r = mount_spawn(m, m->control_command, &m->control_pid);
1043 if (r < 0)
e537352b
LP
1044 goto fail;
1045
1046 mount_set_state(m, MOUNT_REMOUNTING);
1047
1048 return;
1049
1050fail:
f2341e0a 1051 log_unit_warning_errno(UNIT(m), r, "Failed to run 'remount' task: %m");
850b7410 1052 mount_set_reload_result(m, MOUNT_FAILURE_RESOURCES);
22af0e58 1053 mount_enter_dead_or_mounted(m, MOUNT_SUCCESS);
e537352b
LP
1054}
1055
1056static int mount_start(Unit *u) {
1057 Mount *m = MOUNT(u);
07299350 1058 int r;
e537352b
LP
1059
1060 assert(m);
1061
1062 /* We cannot fulfill this request right now, try again later
1063 * please! */
f2aed307
LP
1064 if (IN_SET(m->state,
1065 MOUNT_UNMOUNTING,
1066 MOUNT_UNMOUNTING_SIGTERM,
22af0e58 1067 MOUNT_UNMOUNTING_SIGKILL))
e537352b
LP
1068 return -EAGAIN;
1069
1070 /* Already on it! */
60b912f6 1071 if (m->state == MOUNT_MOUNTING)
e537352b
LP
1072 return 0;
1073
f2aed307 1074 assert(IN_SET(m->state, MOUNT_DEAD, MOUNT_FAILED));
e537352b 1075
07299350
LP
1076 r = unit_start_limit_test(u);
1077 if (r < 0) {
1078 mount_enter_dead(m, MOUNT_FAILURE_START_LIMIT_HIT);
1079 return r;
1080 }
1081
4b58153d
LP
1082 r = unit_acquire_invocation_id(u);
1083 if (r < 0)
1084 return r;
1085
9d2f5178
LP
1086 m->result = MOUNT_SUCCESS;
1087 m->reload_result = MOUNT_SUCCESS;
3c7416b6
LP
1088
1089 u->reset_accounting = true;
9d2f5178 1090
8d567588 1091 mount_enter_mounting(m);
82a2b6bb 1092 return 1;
e537352b
LP
1093}
1094
1095static int mount_stop(Unit *u) {
1096 Mount *m = MOUNT(u);
1097
1098 assert(m);
1099
22af0e58
LP
1100 switch (m->state) {
1101
1102 case MOUNT_UNMOUNTING:
1103 case MOUNT_UNMOUNTING_SIGKILL:
1104 case MOUNT_UNMOUNTING_SIGTERM:
1105 /* Already on it */
e537352b
LP
1106 return 0;
1107
22af0e58
LP
1108 case MOUNT_MOUNTING:
1109 case MOUNT_MOUNTING_DONE:
1110 case MOUNT_REMOUNTING:
1111 /* If we are still waiting for /bin/mount, we go directly into kill mode. */
1112 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_SUCCESS);
1113 return 0;
e537352b 1114
22af0e58
LP
1115 case MOUNT_REMOUNTING_SIGTERM:
1116 /* If we are already waiting for a hung remount, convert this to the matching unmounting state */
1117 mount_set_state(m, MOUNT_UNMOUNTING_SIGTERM);
1118 return 0;
1119
1120 case MOUNT_REMOUNTING_SIGKILL:
1121 /* as above */
1122 mount_set_state(m, MOUNT_UNMOUNTING_SIGKILL);
1123 return 0;
1124
1125 case MOUNT_MOUNTED:
1126 mount_enter_unmounting(m);
1127 return 1;
1128
1129 default:
1130 assert_not_reached("Unexpected state.");
1131 }
e537352b
LP
1132}
1133
1134static int mount_reload(Unit *u) {
1135 Mount *m = MOUNT(u);
1136
1137 assert(m);
1138
22af0e58 1139 if (m->state == MOUNT_MOUNTING_DONE) /* not yet ready to reload, try again */
e537352b
LP
1140 return -EAGAIN;
1141
1142 assert(m->state == MOUNT_MOUNTED);
1143
9d2f5178 1144 mount_enter_remounting(m);
22af0e58 1145
2d018ae2 1146 return 1;
e537352b
LP
1147}
1148
a16e1123
LP
1149static int mount_serialize(Unit *u, FILE *f, FDSet *fds) {
1150 Mount *m = MOUNT(u);
1151
1152 assert(m);
1153 assert(f);
1154 assert(fds);
1155
1156 unit_serialize_item(u, f, "state", mount_state_to_string(m->state));
9d2f5178
LP
1157 unit_serialize_item(u, f, "result", mount_result_to_string(m->result));
1158 unit_serialize_item(u, f, "reload-result", mount_result_to_string(m->reload_result));
a16e1123
LP
1159
1160 if (m->control_pid > 0)
ccd06097 1161 unit_serialize_item_format(u, f, "control-pid", PID_FMT, m->control_pid);
a16e1123
LP
1162
1163 if (m->control_command_id >= 0)
1164 unit_serialize_item(u, f, "control-command", mount_exec_command_to_string(m->control_command_id));
1165
1166 return 0;
1167}
1168
1169static int mount_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1170 Mount *m = MOUNT(u);
a16e1123
LP
1171
1172 assert(u);
1173 assert(key);
1174 assert(value);
1175 assert(fds);
1176
1177 if (streq(key, "state")) {
1178 MountState state;
1179
1180 if ((state = mount_state_from_string(value)) < 0)
f2341e0a 1181 log_unit_debug(u, "Failed to parse state value: %s", value);
a16e1123
LP
1182 else
1183 m->deserialized_state = state;
9d2f5178
LP
1184 } else if (streq(key, "result")) {
1185 MountResult f;
a16e1123 1186
9d2f5178
LP
1187 f = mount_result_from_string(value);
1188 if (f < 0)
f2341e0a 1189 log_unit_debug(u, "Failed to parse result value: %s", value);
9d2f5178
LP
1190 else if (f != MOUNT_SUCCESS)
1191 m->result = f;
1192
1193 } else if (streq(key, "reload-result")) {
1194 MountResult f;
1195
1196 f = mount_result_from_string(value);
1197 if (f < 0)
f2341e0a 1198 log_unit_debug(u, "Failed to parse reload result value: %s", value);
9d2f5178
LP
1199 else if (f != MOUNT_SUCCESS)
1200 m->reload_result = f;
a16e1123
LP
1201
1202 } else if (streq(key, "control-pid")) {
5925dd3c 1203 pid_t pid;
a16e1123 1204
e364ad06 1205 if (parse_pid(value, &pid) < 0)
f2341e0a 1206 log_unit_debug(u, "Failed to parse control-pid value: %s", value);
a16e1123 1207 else
5925dd3c 1208 m->control_pid = pid;
a16e1123
LP
1209 } else if (streq(key, "control-command")) {
1210 MountExecCommand id;
1211
f2341e0a
LP
1212 id = mount_exec_command_from_string(value);
1213 if (id < 0)
1214 log_unit_debug(u, "Failed to parse exec-command value: %s", value);
a16e1123
LP
1215 else {
1216 m->control_command_id = id;
1217 m->control_command = m->exec_command + id;
1218 }
a16e1123 1219 } else
f2341e0a 1220 log_unit_debug(u, "Unknown serialization key: %s", key);
a16e1123
LP
1221
1222 return 0;
1223}
1224
44a6b1b6 1225_pure_ static UnitActiveState mount_active_state(Unit *u) {
e537352b
LP
1226 assert(u);
1227
1228 return state_translation_table[MOUNT(u)->state];
1229}
1230
44a6b1b6 1231_pure_ static const char *mount_sub_state_to_string(Unit *u) {
10a94420
LP
1232 assert(u);
1233
a16e1123 1234 return mount_state_to_string(MOUNT(u)->state);
10a94420
LP
1235}
1236
44a6b1b6 1237_pure_ static bool mount_check_gc(Unit *u) {
701cc384
LP
1238 Mount *m = MOUNT(u);
1239
1240 assert(m);
1241
6b1dc2bd 1242 return m->from_proc_self_mountinfo;
701cc384
LP
1243}
1244
e537352b
LP
1245static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1246 Mount *m = MOUNT(u);
9d2f5178 1247 MountResult f;
e537352b
LP
1248
1249 assert(m);
1250 assert(pid >= 0);
1251
8c47c732
LP
1252 if (pid != m->control_pid)
1253 return;
e537352b 1254
e537352b
LP
1255 m->control_pid = 0;
1256
1f0958f6 1257 if (is_clean_exit(code, status, EXIT_CLEAN_COMMAND, NULL))
9d2f5178
LP
1258 f = MOUNT_SUCCESS;
1259 else if (code == CLD_EXITED)
1260 f = MOUNT_FAILURE_EXIT_CODE;
1261 else if (code == CLD_KILLED)
1262 f = MOUNT_FAILURE_SIGNAL;
1263 else if (code == CLD_DUMPED)
1264 f = MOUNT_FAILURE_CORE_DUMP;
1265 else
1266 assert_not_reached("Unknown code");
1267
850b7410
LP
1268 if (IN_SET(m->state, MOUNT_REMOUNTING, MOUNT_REMOUNTING_SIGKILL, MOUNT_REMOUNTING_SIGTERM))
1269 mount_set_reload_result(m, f);
1270 else if (m->result == MOUNT_SUCCESS)
9d2f5178 1271 m->result = f;
8c47c732 1272
a16e1123 1273 if (m->control_command) {
6ea832a2 1274 exec_status_exit(&m->control_command->exec_status, &m->exec_context, pid, code, status);
9d2f5178 1275
a16e1123
LP
1276 m->control_command = NULL;
1277 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
1278 }
1279
f2341e0a
LP
1280 log_unit_full(u, f == MOUNT_SUCCESS ? LOG_DEBUG : LOG_NOTICE, 0,
1281 "Mount process exited, code=%s status=%i", sigchld_code_to_string(code), status);
e537352b 1282
22af0e58
LP
1283 /* Note that mount(8) returning and the kernel sending us a mount table change event might happen
1284 * out-of-order. If an operation succeed we assume the kernel will follow soon too and already change into the
1285 * resulting state. If it fails we check if the kernel still knows about the mount. and change state
1286 * accordingly. */
e537352b
LP
1287
1288 switch (m->state) {
1289
1290 case MOUNT_MOUNTING:
1291 case MOUNT_MOUNTING_DONE:
e537352b 1292
052364d4
LP
1293 if (f == MOUNT_SUCCESS || m->from_proc_self_mountinfo)
1294 /* If /bin/mount returned success, or if we see the mount point in /proc/self/mountinfo we are
ce954c03 1295 * happy. If we see the first condition first, we should see the second condition
052364d4 1296 * immediately after – or /bin/mount lies to us and is broken. */
9d2f5178 1297 mount_enter_mounted(m, f);
e537352b 1298 else
9d2f5178 1299 mount_enter_dead(m, f);
e537352b
LP
1300 break;
1301
e2f3b44c 1302 case MOUNT_REMOUNTING:
e2f3b44c 1303 case MOUNT_REMOUNTING_SIGTERM:
22af0e58
LP
1304 case MOUNT_REMOUNTING_SIGKILL:
1305 mount_enter_dead_or_mounted(m, MOUNT_SUCCESS);
e2f3b44c
LP
1306 break;
1307
e537352b
LP
1308 case MOUNT_UNMOUNTING:
1309 case MOUNT_UNMOUNTING_SIGKILL:
1310 case MOUNT_UNMOUNTING_SIGTERM:
1311
3cc96856 1312 if (f == MOUNT_SUCCESS && m->from_proc_self_mountinfo) {
22af0e58
LP
1313
1314 /* Still a mount point? If so, let's try again. Most likely there were multiple mount points
1315 * stacked on top of each other. Note that due to the io event priority logic we can be sure
1316 * the new mountinfo is loaded before we process the SIGCHLD for the mount command. */
1317
1318 if (m->n_retry_umount < RETRY_UMOUNT_MAX) {
1319 log_unit_debug(u, "Mount still present, trying again.");
1320 m->n_retry_umount++;
1321 mount_enter_unmounting(m);
1322 } else {
1323 log_unit_debug(u, "Mount still present after %u attempts to unmount, giving up.", m->n_retry_umount);
1324 mount_enter_mounted(m, f);
1325 }
1326 } else
3cc96856 1327 mount_enter_dead_or_mounted(m, f);
22af0e58 1328
e537352b
LP
1329 break;
1330
1331 default:
1332 assert_not_reached("Uh, control process died at wrong time.");
1333 }
c4e2ceae
LP
1334
1335 /* Notify clients about changed exit status */
1336 unit_add_to_dbus_queue(u);
e537352b
LP
1337}
1338
718db961
LP
1339static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata) {
1340 Mount *m = MOUNT(userdata);
e537352b
LP
1341
1342 assert(m);
718db961 1343 assert(m->timer_event_source == source);
e537352b
LP
1344
1345 switch (m->state) {
1346
1347 case MOUNT_MOUNTING:
1348 case MOUNT_MOUNTING_DONE:
22af0e58
LP
1349 log_unit_warning(UNIT(m), "Mounting timed out. Terminating.");
1350 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
e537352b
LP
1351 break;
1352
1353 case MOUNT_REMOUNTING:
79aafbd1 1354 log_unit_warning(UNIT(m), "Remounting timed out. Terminating remount process.");
22af0e58
LP
1355 mount_set_reload_result(m, MOUNT_FAILURE_TIMEOUT);
1356 mount_enter_signal(m, MOUNT_REMOUNTING_SIGTERM, MOUNT_SUCCESS);
e537352b
LP
1357 break;
1358
22af0e58
LP
1359 case MOUNT_REMOUNTING_SIGTERM:
1360 mount_set_reload_result(m, MOUNT_FAILURE_TIMEOUT);
e537352b 1361
4819ff03 1362 if (m->kill_context.send_sigkill) {
22af0e58
LP
1363 log_unit_warning(UNIT(m), "Remounting timed out. Killing.");
1364 mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_SUCCESS);
ba035df2 1365 } else {
22af0e58
LP
1366 log_unit_warning(UNIT(m), "Remounting timed out. Skipping SIGKILL. Ignoring.");
1367 mount_enter_dead_or_mounted(m, MOUNT_SUCCESS);
ba035df2 1368 }
e537352b
LP
1369 break;
1370
22af0e58
LP
1371 case MOUNT_REMOUNTING_SIGKILL:
1372 mount_set_reload_result(m, MOUNT_FAILURE_TIMEOUT);
ba035df2 1373
22af0e58
LP
1374 log_unit_warning(UNIT(m), "Mount process still around after SIGKILL. Ignoring.");
1375 mount_enter_dead_or_mounted(m, MOUNT_SUCCESS);
1376 break;
1377
1378 case MOUNT_UNMOUNTING:
79aafbd1 1379 log_unit_warning(UNIT(m), "Unmounting timed out. Terminating.");
22af0e58 1380 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
e537352b
LP
1381 break;
1382
1383 case MOUNT_UNMOUNTING_SIGTERM:
4819ff03 1384 if (m->kill_context.send_sigkill) {
22af0e58 1385 log_unit_warning(UNIT(m), "Mount process timed out. Killing.");
9d2f5178 1386 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
ba035df2 1387 } else {
22af0e58
LP
1388 log_unit_warning(UNIT(m), "Mount process timed out. Skipping SIGKILL. Ignoring.");
1389 mount_enter_dead_or_mounted(m, MOUNT_FAILURE_TIMEOUT);
ba035df2 1390 }
e537352b
LP
1391 break;
1392
e537352b 1393 case MOUNT_UNMOUNTING_SIGKILL:
22af0e58
LP
1394 log_unit_warning(UNIT(m), "Mount process still around after SIGKILL. Ignoring.");
1395 mount_enter_dead_or_mounted(m, MOUNT_FAILURE_TIMEOUT);
e537352b
LP
1396 break;
1397
1398 default:
1399 assert_not_reached("Timeout at wrong time.");
1400 }
718db961
LP
1401
1402 return 0;
e537352b
LP
1403}
1404
03b8cfed
FB
1405typedef struct {
1406 bool is_mounted;
1407 bool just_mounted;
1408 bool just_changed;
1409} MountSetupFlags;
1410
1411static int mount_setup_new_unit(
1412 Unit *u,
1413 const char *what,
1414 const char *where,
1415 const char *options,
1416 const char *fstype,
1417 MountSetupFlags *flags) {
1418
1419 MountParameters *p;
1420
1421 assert(u);
1422 assert(flags);
1423
1424 u->source_path = strdup("/proc/self/mountinfo");
1425 MOUNT(u)->where = strdup(where);
a51ee72d 1426 if (!u->source_path || !MOUNT(u)->where)
03b8cfed
FB
1427 return -ENOMEM;
1428
1429 /* Make sure to initialize those fields before mount_is_extrinsic(). */
1430 MOUNT(u)->from_proc_self_mountinfo = true;
1431 p = &MOUNT(u)->parameters_proc_self_mountinfo;
1432
1433 p->what = strdup(what);
1434 p->options = strdup(options);
1435 p->fstype = strdup(fstype);
1436 if (!p->what || !p->options || !p->fstype)
1437 return -ENOMEM;
1438
1439 if (!mount_is_extrinsic(MOUNT(u))) {
1440 const char *target;
1441 int r;
1442
1443 target = mount_is_network(p) ? SPECIAL_REMOTE_FS_TARGET : SPECIAL_LOCAL_FS_TARGET;
eef85c4a 1444 r = unit_add_dependency_by_name(u, UNIT_BEFORE, target, NULL, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT);
03b8cfed
FB
1445 if (r < 0)
1446 return r;
1447
eef85c4a 1448 r = unit_add_dependency_by_name(u, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT);
03b8cfed
FB
1449 if (r < 0)
1450 return r;
1451 }
1452
cfcd4318 1453 unit_add_to_load_queue(u);
03b8cfed
FB
1454 flags->is_mounted = true;
1455 flags->just_mounted = true;
1456 flags->just_changed = true;
1457
1458 return 0;
1459}
1460
1461static int mount_setup_existing_unit(
1462 Unit *u,
1463 const char *what,
1464 const char *where,
1465 const char *options,
1466 const char *fstype,
1467 MountSetupFlags *flags) {
1468
1469 MountParameters *p;
1470 bool load_extras = false;
1471 int r1, r2, r3;
1472
1473 assert(u);
1474 assert(flags);
1475
1476 if (!MOUNT(u)->where) {
1477 MOUNT(u)->where = strdup(where);
1478 if (!MOUNT(u)->where)
1479 return -ENOMEM;
1480 }
1481
1482 /* Make sure to initialize those fields before mount_is_extrinsic(). */
1483 p = &MOUNT(u)->parameters_proc_self_mountinfo;
1484
1485 r1 = free_and_strdup(&p->what, what);
1486 r2 = free_and_strdup(&p->options, options);
1487 r3 = free_and_strdup(&p->fstype, fstype);
1488 if (r1 < 0 || r2 < 0 || r3 < 0)
1489 return -ENOMEM;
1490
1491 flags->just_changed = r1 > 0 || r2 > 0 || r3 > 0;
1492 flags->is_mounted = true;
65d36b49 1493 flags->just_mounted = !MOUNT(u)->from_proc_self_mountinfo || MOUNT(u)->just_mounted;
03b8cfed
FB
1494
1495 MOUNT(u)->from_proc_self_mountinfo = true;
1496
1497 if (!mount_is_extrinsic(MOUNT(u)) && mount_is_network(p)) {
1498 /* _netdev option may have shown up late, or on a
1499 * remount. Add remote-fs dependencies, even though
1500 * local-fs ones may already be there.
1501 *
1502 * Note: due to a current limitation (we don't track
1503 * in the dependency "Set*" objects who created a
1504 * dependency), we can only add deps, never lose them,
1505 * until the next full daemon-reload. */
eef85c4a 1506 unit_add_dependency_by_name(u, UNIT_BEFORE, SPECIAL_REMOTE_FS_TARGET, NULL, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT);
03b8cfed
FB
1507 load_extras = true;
1508 }
1509
1510 if (u->load_state == UNIT_NOT_FOUND) {
1511 u->load_state = UNIT_LOADED;
1512 u->load_error = 0;
1513
1514 /* Load in the extras later on, after we
1515 * finished initialization of the unit */
1516
1517 /* FIXME: since we're going to load the unit later on, why setting load_extras=true ? */
1518 load_extras = true;
1519 flags->just_changed = true;
1520 }
1521
1522 if (load_extras)
1523 return mount_add_extras(MOUNT(u));
1524
1525 return 0;
1526}
1527
628c89cc 1528static int mount_setup_unit(
e537352b
LP
1529 Manager *m,
1530 const char *what,
1531 const char *where,
1532 const char *options,
1533 const char *fstype,
e537352b 1534 bool set_flags) {
057d9ab8 1535
03b8cfed
FB
1536 _cleanup_free_ char *e = NULL;
1537 MountSetupFlags flags;
057d9ab8
LP
1538 Unit *u;
1539 int r;
b08d03ff 1540
f50e0a01 1541 assert(m);
b08d03ff
LP
1542 assert(what);
1543 assert(where);
e537352b
LP
1544 assert(options);
1545 assert(fstype);
1546
e537352b
LP
1547 /* Ignore API mount points. They should never be referenced in
1548 * dependencies ever. */
33ff02c9 1549 if (mount_point_is_api(where) || mount_point_ignore(where))
57f2a956 1550 return 0;
b08d03ff 1551
8d567588
LP
1552 if (streq(fstype, "autofs"))
1553 return 0;
1554
4e85aff4
LP
1555 /* probably some kind of swap, ignore */
1556 if (!is_path(where))
b08d03ff
LP
1557 return 0;
1558
7410616c
LP
1559 r = unit_name_from_path(where, ".mount", &e);
1560 if (r < 0)
1561 return r;
b08d03ff 1562
7d17cfbc
MS
1563 u = manager_get_unit(m, e);
1564 if (!u) {
03b8cfed
FB
1565 /* First time we see this mount point meaning that it's
1566 * not been initiated by a mount unit but rather by the
1567 * sysadmin having called mount(8) directly. */
a581e45a 1568 r = unit_new_for_name(m, sizeof(Mount), e, &u);
b08d03ff
LP
1569 if (r < 0)
1570 goto fail;
1571
03b8cfed
FB
1572 r = mount_setup_new_unit(u, what, where, options, fstype, &flags);
1573 if (r < 0)
1574 unit_free(u);
1575 } else
1576 r = mount_setup_existing_unit(u, what, where, options, fstype, &flags);
b08d03ff 1577
03b8cfed 1578 if (r < 0)
e537352b 1579 goto fail;
ff5f34d0 1580
6b1dc2bd 1581 if (set_flags) {
03b8cfed
FB
1582 MOUNT(u)->is_mounted = flags.is_mounted;
1583 MOUNT(u)->just_mounted = flags.just_mounted;
1584 MOUNT(u)->just_changed = flags.just_changed;
b87705cd
LP
1585 }
1586
03b8cfed 1587 if (flags.just_changed)
ff5f34d0 1588 unit_add_to_dbus_queue(u);
c1e1601e 1589
b08d03ff 1590 return 0;
b08d03ff 1591fail:
628c89cc 1592 log_warning_errno(r, "Failed to set up mount unit: %m");
4e85aff4 1593 return r;
b08d03ff
LP
1594}
1595
ef734fd6 1596static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
628c89cc
LP
1597 _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
1598 _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
60b912f6 1599 int r = 0;
b08d03ff
LP
1600
1601 assert(m);
1602
628c89cc
LP
1603 t = mnt_new_table();
1604 if (!t)
8d3ae2bd 1605 return log_oom();
b08d03ff 1606
628c89cc
LP
1607 i = mnt_new_iter(MNT_ITER_FORWARD);
1608 if (!i)
1609 return log_oom();
1610
1611 r = mnt_table_parse_mtab(t, NULL);
5cca8def 1612 if (r < 0)
628c89cc 1613 return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
e537352b 1614
5cca8def
ZJS
1615 r = 0;
1616 for (;;) {
8d3ae2bd 1617 const char *device, *path, *options, *fstype;
527b7a42 1618 _cleanup_free_ char *d = NULL, *p = NULL;
628c89cc 1619 struct libmnt_fs *fs;
8d3ae2bd 1620 int k;
b08d03ff 1621
628c89cc 1622 k = mnt_table_next_fs(t, i, &fs);
5cca8def
ZJS
1623 if (k == 1)
1624 break;
628c89cc
LP
1625 if (k < 0)
1626 return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
5cca8def 1627
8d3ae2bd
CL
1628 device = mnt_fs_get_source(fs);
1629 path = mnt_fs_get_target(fs);
1630 options = mnt_fs_get_options(fs);
1631 fstype = mnt_fs_get_fstype(fs);
a2e0f3d3 1632
c0a7f8d3
DM
1633 if (!device || !path)
1634 continue;
1635
527b7a42 1636 if (cunescape(device, UNESCAPE_RELAX, &d) < 0)
628c89cc
LP
1637 return log_oom();
1638
527b7a42 1639 if (cunescape(path, UNESCAPE_RELAX, &p) < 0)
a57f7e2c 1640 return log_oom();
b08d03ff 1641
628c89cc
LP
1642 (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
1643
1644 k = mount_setup_unit(m, d, p, options, fstype, set_flags);
5cca8def 1645 if (r == 0 && k < 0)
60b912f6 1646 r = k;
b08d03ff
LP
1647 }
1648
e537352b
LP
1649 return r;
1650}
1651
1652static void mount_shutdown(Manager *m) {
1653 assert(m);
1654
718db961
LP
1655 m->mount_event_source = sd_event_source_unref(m->mount_event_source);
1656
d379d442
KZ
1657 mnt_unref_monitor(m->mount_monitor);
1658 m->mount_monitor = NULL;
b08d03ff
LP
1659}
1660
7a7821c8 1661static int mount_get_timeout(Unit *u, usec_t *timeout) {
68db7a3b 1662 Mount *m = MOUNT(u);
7a7821c8 1663 usec_t t;
68db7a3b
ZJS
1664 int r;
1665
1666 if (!m->timer_event_source)
1667 return 0;
1668
7a7821c8 1669 r = sd_event_source_get_time(m->timer_event_source, &t);
68db7a3b
ZJS
1670 if (r < 0)
1671 return r;
7a7821c8
LP
1672 if (t == USEC_INFINITY)
1673 return 0;
68db7a3b 1674
7a7821c8 1675 *timeout = t;
68db7a3b
ZJS
1676 return 1;
1677}
1678
1201cae7 1679static int synthesize_root_mount(Manager *m) {
11222d0f
LP
1680 Unit *u;
1681 int r;
1682
1683 assert(m);
1684
1685 /* Whatever happens, we know for sure that the root directory is around, and cannot go away. Let's
1686 * unconditionally synthesize it here and mark it as perpetual. */
1687
1688 u = manager_get_unit(m, SPECIAL_ROOT_MOUNT);
1689 if (!u) {
a581e45a 1690 r = unit_new_for_name(m, sizeof(Mount), SPECIAL_ROOT_MOUNT, &u);
1201cae7
LP
1691 if (r < 0)
1692 return log_error_errno(r, "Failed to allocate the special " SPECIAL_ROOT_MOUNT " unit: %m");
11222d0f
LP
1693 }
1694
1695 u->perpetual = true;
1696 MOUNT(u)->deserialized_state = MOUNT_MOUNTED;
1697
1698 unit_add_to_load_queue(u);
1699 unit_add_to_dbus_queue(u);
1201cae7
LP
1700
1701 return 0;
11222d0f
LP
1702}
1703
1704static bool mount_is_mounted(Mount *m) {
1705 assert(m);
1706
1707 return UNIT(m)->perpetual || m->is_mounted;
1708}
1709
ba64af90 1710static void mount_enumerate(Manager *m) {
b08d03ff 1711 int r;
d379d442 1712
b08d03ff
LP
1713 assert(m);
1714
1201cae7
LP
1715 r = synthesize_root_mount(m);
1716 if (r < 0)
1717 goto fail;
11222d0f 1718
8d3ae2bd
CL
1719 mnt_init_debug(0);
1720
d379d442
KZ
1721 if (!m->mount_monitor) {
1722 int fd;
ef734fd6 1723
d379d442
KZ
1724 m->mount_monitor = mnt_new_monitor();
1725 if (!m->mount_monitor) {
ba64af90 1726 log_oom();
718db961 1727 goto fail;
d379d442 1728 }
29083707 1729
d379d442 1730 r = mnt_monitor_enable_kernel(m->mount_monitor, 1);
ba64af90
LP
1731 if (r < 0) {
1732 log_error_errno(r, "Failed to enable watching of kernel mount events: %m");
29083707 1733 goto fail;
ba64af90
LP
1734 }
1735
d379d442 1736 r = mnt_monitor_enable_userspace(m->mount_monitor, 1, NULL);
ba64af90
LP
1737 if (r < 0) {
1738 log_error_errno(r, "Failed to enable watching of userspace mount events: %m");
f7c1ad4f 1739 goto fail;
ba64af90 1740 }
90598531 1741
d379d442
KZ
1742 /* mnt_unref_monitor() will close the fd */
1743 fd = r = mnt_monitor_get_fd(m->mount_monitor);
ba64af90
LP
1744 if (r < 0) {
1745 log_error_errno(r, "Failed to acquire watch file descriptor: %m");
f7c1ad4f 1746 goto fail;
ba64af90 1747 }
befb6d54 1748
d379d442 1749 r = sd_event_add_io(m->event, &m->mount_event_source, fd, EPOLLIN, mount_dispatch_io, m);
ba64af90
LP
1750 if (r < 0) {
1751 log_error_errno(r, "Failed to watch mount file descriptor: %m");
befb6d54 1752 goto fail;
ba64af90 1753 }
befb6d54 1754
d379d442 1755 r = sd_event_source_set_priority(m->mount_event_source, -10);
ba64af90
LP
1756 if (r < 0) {
1757 log_error_errno(r, "Failed to adjust mount watch priority: %m");
befb6d54 1758 goto fail;
ba64af90 1759 }
7dfbe2e3 1760
d379d442 1761 (void) sd_event_source_set_description(m->mount_event_source, "mount-monitor-dispatch");
befb6d54
CL
1762 }
1763
e62d8c39
ZJS
1764 r = mount_load_proc_self_mountinfo(m, false);
1765 if (r < 0)
b08d03ff
LP
1766 goto fail;
1767
ba64af90 1768 return;
b08d03ff
LP
1769
1770fail:
1771 mount_shutdown(m);
5cb5a6ff
LP
1772}
1773
718db961 1774static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
fcd8b266 1775 _cleanup_set_free_ Set *around = NULL, *gone = NULL;
718db961 1776 Manager *m = userdata;
fcd8b266
LP
1777 const char *what;
1778 Iterator i;
595ed347 1779 Unit *u;
ef734fd6
LP
1780 int r;
1781
1782 assert(m);
d379d442 1783 assert(revents & EPOLLIN);
ef734fd6 1784
d379d442 1785 if (fd == mnt_monitor_get_fd(m->mount_monitor)) {
df63dda6 1786 bool rescan = false;
befb6d54 1787
d379d442
KZ
1788 /* Drain all events and verify that the event is valid.
1789 *
1790 * Note that libmount also monitors /run/mount mkdir if the
1791 * directory does not exist yet. The mkdir may generate event
1792 * which is irrelevant for us.
1793 *
1794 * error: r < 0; valid: r == 0, false positive: rc == 1 */
1795 do {
1796 r = mnt_monitor_next_change(m->mount_monitor, NULL, NULL);
1797 if (r == 0)
1798 rescan = true;
1799 else if (r < 0)
1800 return log_error_errno(r, "Failed to drain libmount events");
1801 } while (r == 0);
1802
1803 log_debug("libmount event [rescan: %s]", yes_no(rescan));
befb6d54
CL
1804 if (!rescan)
1805 return 0;
1806 }
ef734fd6 1807
4f0eedb7
ZJS
1808 r = mount_load_proc_self_mountinfo(m, true);
1809 if (r < 0) {
e537352b 1810 /* Reset flags, just in case, for later calls */
595ed347
MS
1811 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1812 Mount *mount = MOUNT(u);
e537352b
LP
1813
1814 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1815 }
1816
718db961 1817 return 0;
ef734fd6
LP
1818 }
1819
1820 manager_dispatch_load_queue(m);
1821
595ed347
MS
1822 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1823 Mount *mount = MOUNT(u);
ef734fd6 1824
11222d0f 1825 if (!mount_is_mounted(mount)) {
e537352b 1826
394763f6
LP
1827 /* A mount point is not around right now. It
1828 * might be gone, or might never have
1829 * existed. */
1830
1831 if (mount->from_proc_self_mountinfo &&
1832 mount->parameters_proc_self_mountinfo.what) {
1833
1834 /* Remember that this device might just have disappeared */
1835 if (set_ensure_allocated(&gone, &string_hash_ops) < 0 ||
1836 set_put(gone, mount->parameters_proc_self_mountinfo.what) < 0)
1837 log_oom(); /* we don't care too much about OOM here... */
1838 }
fcd8b266 1839
ef734fd6 1840 mount->from_proc_self_mountinfo = false;
e537352b
LP
1841
1842 switch (mount->state) {
1843
1844 case MOUNT_MOUNTED:
aef83136
LP
1845 /* This has just been unmounted by
1846 * somebody else, follow the state
1847 * change. */
cf6f7f66 1848 mount->result = MOUNT_SUCCESS; /* make sure we forget any earlier umount failures */
9d2f5178 1849 mount_enter_dead(mount, MOUNT_SUCCESS);
e537352b
LP
1850 break;
1851
1852 default:
e537352b 1853 break;
e537352b
LP
1854 }
1855
1856 } else if (mount->just_mounted || mount->just_changed) {
1857
fcd8b266 1858 /* A mount point was added or changed */
e537352b
LP
1859
1860 switch (mount->state) {
1861
1862 case MOUNT_DEAD:
fdf20a31 1863 case MOUNT_FAILED:
4b58153d
LP
1864
1865 /* This has just been mounted by somebody else, follow the state change, but let's
1866 * generate a new invocation ID for this implicitly and automatically. */
1867 (void) unit_acquire_invocation_id(UNIT(mount));
9d2f5178 1868 mount_enter_mounted(mount, MOUNT_SUCCESS);
e537352b
LP
1869 break;
1870
1871 case MOUNT_MOUNTING:
5bcb0f2b 1872 mount_set_state(mount, MOUNT_MOUNTING_DONE);
e537352b
LP
1873 break;
1874
1875 default:
1876 /* Nothing really changed, but let's
1877 * issue an notification call
1878 * nonetheless, in case somebody is
1879 * waiting for this. (e.g. file system
1880 * ro/rw remounts.) */
1881 mount_set_state(mount, mount->state);
1882 break;
1883 }
394763f6 1884 }
fcd8b266 1885
11222d0f 1886 if (mount_is_mounted(mount) &&
394763f6
LP
1887 mount->from_proc_self_mountinfo &&
1888 mount->parameters_proc_self_mountinfo.what) {
fcd8b266 1889
394763f6
LP
1890 if (set_ensure_allocated(&around, &string_hash_ops) < 0 ||
1891 set_put(around, mount->parameters_proc_self_mountinfo.what) < 0)
1892 log_oom();
e537352b
LP
1893 }
1894
1895 /* Reset the flags for later calls */
1896 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1897 }
718db961 1898
fcd8b266
LP
1899 SET_FOREACH(what, gone, i) {
1900 if (set_contains(around, what))
1901 continue;
1902
1903 /* Let the device units know that the device is no longer mounted */
1904 (void) device_found_node(m, what, false, DEVICE_FOUND_MOUNT, true);
1905 }
1906
718db961 1907 return 0;
e537352b
LP
1908}
1909
fdf20a31 1910static void mount_reset_failed(Unit *u) {
5632e374
LP
1911 Mount *m = MOUNT(u);
1912
1913 assert(m);
1914
fdf20a31 1915 if (m->state == MOUNT_FAILED)
5632e374
LP
1916 mount_set_state(m, MOUNT_DEAD);
1917
9d2f5178
LP
1918 m->result = MOUNT_SUCCESS;
1919 m->reload_result = MOUNT_SUCCESS;
5632e374
LP
1920}
1921
718db961 1922static int mount_kill(Unit *u, KillWho who, int signo, sd_bus_error *error) {
22af0e58
LP
1923 Mount *m = MOUNT(u);
1924
1925 assert(m);
1926
814cc562 1927 return unit_kill_common(u, who, signo, -1, MOUNT(u)->control_pid, error);
8a0867d6
LP
1928}
1929
291d565a
LP
1930static int mount_control_pid(Unit *u) {
1931 Mount *m = MOUNT(u);
1932
1933 assert(m);
1934
1935 return m->control_pid;
1936}
1937
a16e1123
LP
1938static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = {
1939 [MOUNT_EXEC_MOUNT] = "ExecMount",
1940 [MOUNT_EXEC_UNMOUNT] = "ExecUnmount",
1941 [MOUNT_EXEC_REMOUNT] = "ExecRemount",
1942};
1943
1944DEFINE_STRING_TABLE_LOOKUP(mount_exec_command, MountExecCommand);
1945
9d2f5178
LP
1946static const char* const mount_result_table[_MOUNT_RESULT_MAX] = {
1947 [MOUNT_SUCCESS] = "success",
1948 [MOUNT_FAILURE_RESOURCES] = "resources",
1949 [MOUNT_FAILURE_TIMEOUT] = "timeout",
1950 [MOUNT_FAILURE_EXIT_CODE] = "exit-code",
1951 [MOUNT_FAILURE_SIGNAL] = "signal",
07299350
LP
1952 [MOUNT_FAILURE_CORE_DUMP] = "core-dump",
1953 [MOUNT_FAILURE_START_LIMIT_HIT] = "start-limit-hit",
9d2f5178
LP
1954};
1955
1956DEFINE_STRING_TABLE_LOOKUP(mount_result, MountResult);
1957
87f0e418 1958const UnitVTable mount_vtable = {
7d17cfbc 1959 .object_size = sizeof(Mount),
718db961
LP
1960 .exec_context_offset = offsetof(Mount, exec_context),
1961 .cgroup_context_offset = offsetof(Mount, cgroup_context),
1962 .kill_context_offset = offsetof(Mount, kill_context),
613b411c 1963 .exec_runtime_offset = offsetof(Mount, exec_runtime),
29206d46 1964 .dynamic_creds_offset = offsetof(Mount, dynamic_creds),
3ef63c31 1965
f975e971
LP
1966 .sections =
1967 "Unit\0"
1968 "Mount\0"
1969 "Install\0",
4ad49000 1970 .private_section = "Mount",
71645aca 1971
e537352b
LP
1972 .init = mount_init,
1973 .load = mount_load,
034c6ed7 1974 .done = mount_done,
e537352b 1975
f50e0a01
LP
1976 .coldplug = mount_coldplug,
1977
034c6ed7 1978 .dump = mount_dump,
5cb5a6ff 1979
e537352b
LP
1980 .start = mount_start,
1981 .stop = mount_stop,
1982 .reload = mount_reload,
1983
8a0867d6
LP
1984 .kill = mount_kill,
1985
a16e1123
LP
1986 .serialize = mount_serialize,
1987 .deserialize_item = mount_deserialize_item,
1988
f50e0a01 1989 .active_state = mount_active_state,
10a94420 1990 .sub_state_to_string = mount_sub_state_to_string,
b08d03ff 1991
701cc384
LP
1992 .check_gc = mount_check_gc,
1993
e537352b 1994 .sigchld_event = mount_sigchld_event,
e537352b 1995
fdf20a31 1996 .reset_failed = mount_reset_failed,
291d565a
LP
1997
1998 .control_pid = mount_control_pid,
5632e374 1999
718db961 2000 .bus_vtable = bus_mount_vtable,
74c964d3
LP
2001 .bus_set_property = bus_mount_set_property,
2002 .bus_commit_properties = bus_mount_commit_properties,
4139c1b2 2003
68db7a3b
ZJS
2004 .get_timeout = mount_get_timeout,
2005
0e252f6b
TG
2006 .can_transient = true,
2007
f50e0a01 2008 .enumerate = mount_enumerate,
c6918296
MS
2009 .shutdown = mount_shutdown,
2010
2011 .status_message_formats = {
2012 .starting_stopping = {
2013 [0] = "Mounting %s...",
2014 [1] = "Unmounting %s...",
2015 },
2016 .finished_start_job = {
2017 [JOB_DONE] = "Mounted %s.",
2018 [JOB_FAILED] = "Failed to mount %s.",
c6918296
MS
2019 [JOB_TIMEOUT] = "Timed out mounting %s.",
2020 },
2021 .finished_stop_job = {
2022 [JOB_DONE] = "Unmounted %s.",
2023 [JOB_FAILED] = "Failed unmounting %s.",
2024 [JOB_TIMEOUT] = "Timed out unmounting %s.",
2025 },
2026 },
5cb5a6ff 2027};