]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/mount.c
Merge pull request #8101 from keszybz/two-gcc-workarounds
[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,
b6ba0c16 58 [MOUNT_MOUNTING_DONE] = UNIT_ACTIVATING,
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) {
91899792 710 char buf[FORMAT_TIMESPAN_MAX] = {};
e537352b
LP
711 Mount *m = MOUNT(u);
712 MountParameters *p;
713
714 assert(m);
715 assert(f);
716
cb39ed3f 717 p = get_mount_parameters(m);
e537352b
LP
718
719 fprintf(f,
720 "%sMount State: %s\n"
81a5c6d0 721 "%sResult: %s\n"
e537352b
LP
722 "%sWhere: %s\n"
723 "%sWhat: %s\n"
724 "%sFile System Type: %s\n"
725 "%sOptions: %s\n"
e537352b
LP
726 "%sFrom /proc/self/mountinfo: %s\n"
727 "%sFrom fragment: %s\n"
ad2706db 728 "%sExtrinsic: %s\n"
e520950a 729 "%sDirectoryMode: %04o\n"
49915de2 730 "%sSloppyOptions: %s\n"
4f8d40a9 731 "%sLazyUnmount: %s\n"
91899792
YW
732 "%sForceUnmount: %s\n"
733 "%sTimoutSec: %s\n",
a16e1123 734 prefix, mount_state_to_string(m->state),
81a5c6d0 735 prefix, mount_result_to_string(m->result),
e537352b 736 prefix, m->where,
1e4fc9b1
HH
737 prefix, p ? strna(p->what) : "n/a",
738 prefix, p ? strna(p->fstype) : "n/a",
739 prefix, p ? strna(p->options) : "n/a",
e537352b
LP
740 prefix, yes_no(m->from_proc_self_mountinfo),
741 prefix, yes_no(m->from_fragment),
ad2706db 742 prefix, yes_no(mount_is_extrinsic(m)),
e520950a 743 prefix, m->directory_mode,
49915de2 744 prefix, yes_no(m->sloppy_options),
4f8d40a9 745 prefix, yes_no(m->lazy_unmount),
91899792
YW
746 prefix, yes_no(m->force_unmount),
747 prefix, format_timespan(buf, sizeof(buf), m->timeout_usec, USEC_PER_SEC));
e537352b
LP
748
749 if (m->control_pid > 0)
750 fprintf(f,
ccd06097
ZJS
751 "%sControl PID: "PID_FMT"\n",
752 prefix, m->control_pid);
e537352b
LP
753
754 exec_context_dump(&m->exec_context, f, prefix);
4819ff03 755 kill_context_dump(&m->kill_context, f, prefix);
18f573aa 756 cgroup_context_dump(&m->cgroup_context, f, prefix);
e537352b
LP
757}
758
a16e1123 759static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
3c7416b6 760
9fa95f85 761 ExecParameters exec_params = {
1703fa41 762 .flags = EXEC_APPLY_SANDBOXING|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN,
c39f1ce2
LP
763 .stdin_fd = -1,
764 .stdout_fd = -1,
765 .stderr_fd = -1,
9fa95f85 766 };
3c7416b6
LP
767 pid_t pid;
768 int r;
a16e1123
LP
769
770 assert(m);
771 assert(c);
772 assert(_pid);
773
3c7416b6 774 r = unit_prepare_exec(UNIT(m));
29206d46
LP
775 if (r < 0)
776 return r;
777
36c16a7c 778 r = mount_arm_timer(m, usec_add(now(CLOCK_MONOTONIC), m->timeout_usec));
36697dc0 779 if (r < 0)
36c16a7c 780 return r;
a16e1123 781
19bbdd98 782 manager_set_exec_params(UNIT(m)->manager, &exec_params);
f0d47797 783 unit_set_exec_params(UNIT(m), &exec_params);
9fa95f85 784
f2341e0a
LP
785 r = exec_spawn(UNIT(m),
786 c,
4ad49000 787 &m->exec_context,
9fa95f85 788 &exec_params,
613b411c 789 m->exec_runtime,
29206d46 790 &m->dynamic_creds,
4ad49000
LP
791 &pid);
792 if (r < 0)
36c16a7c 793 return r;
a16e1123 794
4ad49000
LP
795 r = unit_watch_pid(UNIT(m), pid);
796 if (r < 0)
a16e1123 797 /* FIXME: we need to do something here */
36c16a7c 798 return r;
a16e1123
LP
799
800 *_pid = pid;
801
802 return 0;
a16e1123
LP
803}
804
9d2f5178 805static void mount_enter_dead(Mount *m, MountResult f) {
e537352b
LP
806 assert(m);
807
a0fef983 808 if (m->result == MOUNT_SUCCESS)
9d2f5178 809 m->result = f;
e537352b 810
ed77d407
LP
811 if (m->result != MOUNT_SUCCESS)
812 log_unit_warning(UNIT(m), "Failed with result '%s'.", mount_result_to_string(m->result));
813
29206d46
LP
814 mount_set_state(m, m->result != MOUNT_SUCCESS ? MOUNT_FAILED : MOUNT_DEAD);
815
613b411c
LP
816 exec_runtime_destroy(m->exec_runtime);
817 m->exec_runtime = exec_runtime_unref(m->exec_runtime);
818
3536f49e 819 exec_context_destroy_runtime_directory(&m->exec_context, UNIT(m)->manager->prefix[EXEC_DIRECTORY_RUNTIME]);
e66cf1a3 820
00d9ef85
LP
821 unit_unref_uid_gid(UNIT(m), true);
822
29206d46 823 dynamic_creds_destroy(&m->dynamic_creds);
e537352b
LP
824}
825
9d2f5178 826static void mount_enter_mounted(Mount *m, MountResult f) {
80876c20
LP
827 assert(m);
828
a0fef983 829 if (m->result == MOUNT_SUCCESS)
9d2f5178 830 m->result = f;
80876c20
LP
831
832 mount_set_state(m, MOUNT_MOUNTED);
833}
834
22af0e58
LP
835static void mount_enter_dead_or_mounted(Mount *m, MountResult f) {
836 assert(m);
837
838 /* Enter DEAD or MOUNTED state, depending on what the kernel currently says about the mount point. We use this
839 * whenever we executed an operation, so that our internal state reflects what the kernel says again, after all
840 * ultimately we just mirror the kernel's internal state on this. */
841
842 if (m->from_proc_self_mountinfo)
843 mount_enter_mounted(m, f);
844 else
845 mount_enter_dead(m, f);
846}
847
848static int state_to_kill_operation(MountState state) {
849 switch (state) {
850
851 case MOUNT_REMOUNTING_SIGTERM:
852 case MOUNT_UNMOUNTING_SIGTERM:
853 return KILL_TERMINATE;
854
855 case MOUNT_REMOUNTING_SIGKILL:
856 case MOUNT_UNMOUNTING_SIGKILL:
857 return KILL_KILL;
858
859 default:
860 return _KILL_OPERATION_INVALID;
861 }
862}
863
9d2f5178 864static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
e537352b
LP
865 int r;
866
867 assert(m);
868
a0fef983 869 if (m->result == MOUNT_SUCCESS)
9d2f5178 870 m->result = f;
e537352b 871
cd2086fe
LP
872 r = unit_kill_context(
873 UNIT(m),
874 &m->kill_context,
22af0e58 875 state_to_kill_operation(state),
cd2086fe
LP
876 -1,
877 m->control_pid,
878 false);
879 if (r < 0)
880 goto fail;
e537352b 881
cd2086fe 882 if (r > 0) {
36c16a7c 883 r = mount_arm_timer(m, usec_add(now(CLOCK_MONOTONIC), m->timeout_usec));
36697dc0 884 if (r < 0)
80876c20 885 goto fail;
e537352b 886
80876c20 887 mount_set_state(m, state);
22af0e58 888 } else if (state == MOUNT_REMOUNTING_SIGTERM && m->kill_context.send_sigkill)
ac84d1fb 889 mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_SUCCESS);
22af0e58 890 else if (IN_SET(state, MOUNT_REMOUNTING_SIGTERM, MOUNT_REMOUNTING_SIGKILL))
9d2f5178 891 mount_enter_mounted(m, MOUNT_SUCCESS);
22af0e58 892 else if (state == MOUNT_UNMOUNTING_SIGTERM && m->kill_context.send_sigkill)
ac84d1fb 893 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_SUCCESS);
80876c20 894 else
22af0e58 895 mount_enter_dead_or_mounted(m, MOUNT_SUCCESS);
e537352b
LP
896
897 return;
898
899fail:
f2341e0a 900 log_unit_warning_errno(UNIT(m), r, "Failed to kill processes: %m");
22af0e58 901 mount_enter_dead_or_mounted(m, MOUNT_FAILURE_RESOURCES);
5261ba90
TT
902}
903
9d2f5178 904static void mount_enter_unmounting(Mount *m) {
e537352b
LP
905 int r;
906
907 assert(m);
908
7d54a03a
LP
909 /* Start counting our attempts */
910 if (!IN_SET(m->state,
911 MOUNT_UNMOUNTING,
912 MOUNT_UNMOUNTING_SIGTERM,
913 MOUNT_UNMOUNTING_SIGKILL))
914 m->n_retry_umount = 0;
915
a16e1123
LP
916 m->control_command_id = MOUNT_EXEC_UNMOUNT;
917 m->control_command = m->exec_command + MOUNT_EXEC_UNMOUNT;
e537352b 918
83897d54 919 r = exec_command_set(m->control_command, UMOUNT_PATH, m->where, "-c", NULL);
e520950a
BR
920 if (r >= 0 && m->lazy_unmount)
921 r = exec_command_append(m->control_command, "-l", NULL);
4f8d40a9
BR
922 if (r >= 0 && m->force_unmount)
923 r = exec_command_append(m->control_command, "-f", NULL);
7d54a03a 924 if (r < 0)
e537352b
LP
925 goto fail;
926
a16e1123 927 mount_unwatch_control_pid(m);
5e94833f 928
7d54a03a
LP
929 r = mount_spawn(m, m->control_command, &m->control_pid);
930 if (r < 0)
e537352b
LP
931 goto fail;
932
933 mount_set_state(m, MOUNT_UNMOUNTING);
934
935 return;
936
937fail:
f2341e0a 938 log_unit_warning_errno(UNIT(m), r, "Failed to run 'umount' task: %m");
22af0e58 939 mount_enter_dead_or_mounted(m, MOUNT_FAILURE_RESOURCES);
e537352b
LP
940}
941
8d567588 942static void mount_enter_mounting(Mount *m) {
e537352b 943 int r;
cb39ed3f 944 MountParameters *p;
e537352b
LP
945
946 assert(m);
947
25cd4964 948 r = unit_fail_if_noncanonical(UNIT(m), m->where);
f2341e0a
LP
949 if (r < 0)
950 goto fail;
951
952 (void) mkdir_p_label(m->where, m->directory_mode);
3e5235b0 953
f2341e0a 954 unit_warn_if_dir_nonempty(UNIT(m), m->where);
257f1d8e 955
a4634b21
LP
956 unit_warn_leftover_processes(UNIT(m));
957
958 m->control_command_id = MOUNT_EXEC_MOUNT;
959 m->control_command = m->exec_command + MOUNT_EXEC_MOUNT;
960
cb39ed3f 961 /* Create the source directory for bind-mounts if needed */
6b1dc2bd 962 p = get_mount_parameters_fragment(m);
cb39ed3f 963 if (p && mount_is_bind(p))
f2341e0a 964 (void) mkdir_p_label(p->what, m->directory_mode);
5261ba90 965
b294b79f 966 if (p) {
17a1c597
ZJS
967 _cleanup_free_ char *opts = NULL;
968
b294b79f 969 r = fstab_filter_options(p->options, "nofail\0" "noauto\0" "auto\0", NULL, NULL, &opts);
17a1c597
ZJS
970 if (r < 0)
971 goto fail;
972
b294b79f 973 r = exec_command_set(m->control_command, MOUNT_PATH, p->what, m->where, NULL);
e86b3761
ZJS
974 if (r >= 0 && m->sloppy_options)
975 r = exec_command_append(m->control_command, "-s", NULL);
b294b79f
MO
976 if (r >= 0 && p->fstype)
977 r = exec_command_append(m->control_command, "-t", p->fstype, NULL);
0c47569a 978 if (r >= 0 && !isempty(opts))
17a1c597 979 r = exec_command_append(m->control_command, "-o", opts, NULL);
e86b3761 980 } else
e537352b 981 r = -ENOENT;
e537352b
LP
982 if (r < 0)
983 goto fail;
984
a16e1123 985 mount_unwatch_control_pid(m);
5e94833f 986
257f1d8e
LP
987 r = mount_spawn(m, m->control_command, &m->control_pid);
988 if (r < 0)
e537352b
LP
989 goto fail;
990
991 mount_set_state(m, MOUNT_MOUNTING);
992
993 return;
994
995fail:
f2341e0a 996 log_unit_warning_errno(UNIT(m), r, "Failed to run 'mount' task: %m");
22af0e58 997 mount_enter_dead_or_mounted(m, MOUNT_FAILURE_RESOURCES);
e537352b
LP
998}
999
850b7410
LP
1000static void mount_set_reload_result(Mount *m, MountResult result) {
1001 assert(m);
1002
1003 /* Only store the first error we encounter */
1004 if (m->reload_result != MOUNT_SUCCESS)
1005 return;
1006
1007 m->reload_result = result;
1008}
1009
9d2f5178 1010static void mount_enter_remounting(Mount *m) {
e537352b 1011 int r;
b294b79f 1012 MountParameters *p;
e537352b
LP
1013
1014 assert(m);
1015
850b7410
LP
1016 /* Reset reload result when we are about to start a new remount operation */
1017 m->reload_result = MOUNT_SUCCESS;
1018
a16e1123
LP
1019 m->control_command_id = MOUNT_EXEC_REMOUNT;
1020 m->control_command = m->exec_command + MOUNT_EXEC_REMOUNT;
e537352b 1021
b294b79f
MO
1022 p = get_mount_parameters_fragment(m);
1023 if (p) {
e537352b
LP
1024 const char *o;
1025
b294b79f
MO
1026 if (p->options)
1027 o = strjoina("remount,", p->options);
718db961 1028 else
e537352b
LP
1029 o = "remount";
1030
f00929ad 1031 r = exec_command_set(m->control_command, MOUNT_PATH,
b294b79f 1032 p->what, m->where,
e86b3761 1033 "-o", o, NULL);
e86b3761
ZJS
1034 if (r >= 0 && m->sloppy_options)
1035 r = exec_command_append(m->control_command, "-s", NULL);
b294b79f
MO
1036 if (r >= 0 && p->fstype)
1037 r = exec_command_append(m->control_command, "-t", p->fstype, NULL);
6b1dc2bd 1038 } else
e537352b 1039 r = -ENOENT;
60b912f6 1040 if (r < 0)
e537352b 1041 goto fail;
e537352b 1042
a16e1123 1043 mount_unwatch_control_pid(m);
5e94833f 1044
718db961
LP
1045 r = mount_spawn(m, m->control_command, &m->control_pid);
1046 if (r < 0)
e537352b
LP
1047 goto fail;
1048
1049 mount_set_state(m, MOUNT_REMOUNTING);
1050
1051 return;
1052
1053fail:
f2341e0a 1054 log_unit_warning_errno(UNIT(m), r, "Failed to run 'remount' task: %m");
850b7410 1055 mount_set_reload_result(m, MOUNT_FAILURE_RESOURCES);
22af0e58 1056 mount_enter_dead_or_mounted(m, MOUNT_SUCCESS);
e537352b
LP
1057}
1058
1059static int mount_start(Unit *u) {
1060 Mount *m = MOUNT(u);
07299350 1061 int r;
e537352b
LP
1062
1063 assert(m);
1064
1065 /* We cannot fulfill this request right now, try again later
1066 * please! */
f2aed307
LP
1067 if (IN_SET(m->state,
1068 MOUNT_UNMOUNTING,
1069 MOUNT_UNMOUNTING_SIGTERM,
22af0e58 1070 MOUNT_UNMOUNTING_SIGKILL))
e537352b
LP
1071 return -EAGAIN;
1072
1073 /* Already on it! */
60b912f6 1074 if (m->state == MOUNT_MOUNTING)
e537352b
LP
1075 return 0;
1076
f2aed307 1077 assert(IN_SET(m->state, MOUNT_DEAD, MOUNT_FAILED));
e537352b 1078
07299350
LP
1079 r = unit_start_limit_test(u);
1080 if (r < 0) {
1081 mount_enter_dead(m, MOUNT_FAILURE_START_LIMIT_HIT);
1082 return r;
1083 }
1084
4b58153d
LP
1085 r = unit_acquire_invocation_id(u);
1086 if (r < 0)
1087 return r;
1088
9d2f5178
LP
1089 m->result = MOUNT_SUCCESS;
1090 m->reload_result = MOUNT_SUCCESS;
3c7416b6
LP
1091
1092 u->reset_accounting = true;
9d2f5178 1093
8d567588 1094 mount_enter_mounting(m);
82a2b6bb 1095 return 1;
e537352b
LP
1096}
1097
1098static int mount_stop(Unit *u) {
1099 Mount *m = MOUNT(u);
1100
1101 assert(m);
1102
22af0e58
LP
1103 switch (m->state) {
1104
1105 case MOUNT_UNMOUNTING:
1106 case MOUNT_UNMOUNTING_SIGKILL:
1107 case MOUNT_UNMOUNTING_SIGTERM:
1108 /* Already on it */
e537352b
LP
1109 return 0;
1110
22af0e58
LP
1111 case MOUNT_MOUNTING:
1112 case MOUNT_MOUNTING_DONE:
1113 case MOUNT_REMOUNTING:
1114 /* If we are still waiting for /bin/mount, we go directly into kill mode. */
1115 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_SUCCESS);
1116 return 0;
e537352b 1117
22af0e58
LP
1118 case MOUNT_REMOUNTING_SIGTERM:
1119 /* If we are already waiting for a hung remount, convert this to the matching unmounting state */
1120 mount_set_state(m, MOUNT_UNMOUNTING_SIGTERM);
1121 return 0;
1122
1123 case MOUNT_REMOUNTING_SIGKILL:
1124 /* as above */
1125 mount_set_state(m, MOUNT_UNMOUNTING_SIGKILL);
1126 return 0;
1127
1128 case MOUNT_MOUNTED:
1129 mount_enter_unmounting(m);
1130 return 1;
1131
1132 default:
1133 assert_not_reached("Unexpected state.");
1134 }
e537352b
LP
1135}
1136
1137static int mount_reload(Unit *u) {
1138 Mount *m = MOUNT(u);
1139
1140 assert(m);
e537352b
LP
1141 assert(m->state == MOUNT_MOUNTED);
1142
9d2f5178 1143 mount_enter_remounting(m);
22af0e58 1144
2d018ae2 1145 return 1;
e537352b
LP
1146}
1147
a16e1123
LP
1148static int mount_serialize(Unit *u, FILE *f, FDSet *fds) {
1149 Mount *m = MOUNT(u);
1150
1151 assert(m);
1152 assert(f);
1153 assert(fds);
1154
1155 unit_serialize_item(u, f, "state", mount_state_to_string(m->state));
9d2f5178
LP
1156 unit_serialize_item(u, f, "result", mount_result_to_string(m->result));
1157 unit_serialize_item(u, f, "reload-result", mount_result_to_string(m->reload_result));
a16e1123
LP
1158
1159 if (m->control_pid > 0)
ccd06097 1160 unit_serialize_item_format(u, f, "control-pid", PID_FMT, m->control_pid);
a16e1123
LP
1161
1162 if (m->control_command_id >= 0)
1163 unit_serialize_item(u, f, "control-command", mount_exec_command_to_string(m->control_command_id));
1164
1165 return 0;
1166}
1167
1168static int mount_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1169 Mount *m = MOUNT(u);
a16e1123
LP
1170
1171 assert(u);
1172 assert(key);
1173 assert(value);
1174 assert(fds);
1175
1176 if (streq(key, "state")) {
1177 MountState state;
1178
1179 if ((state = mount_state_from_string(value)) < 0)
f2341e0a 1180 log_unit_debug(u, "Failed to parse state value: %s", value);
a16e1123
LP
1181 else
1182 m->deserialized_state = state;
9d2f5178
LP
1183 } else if (streq(key, "result")) {
1184 MountResult f;
a16e1123 1185
9d2f5178
LP
1186 f = mount_result_from_string(value);
1187 if (f < 0)
f2341e0a 1188 log_unit_debug(u, "Failed to parse result value: %s", value);
9d2f5178
LP
1189 else if (f != MOUNT_SUCCESS)
1190 m->result = f;
1191
1192 } else if (streq(key, "reload-result")) {
1193 MountResult f;
1194
1195 f = mount_result_from_string(value);
1196 if (f < 0)
f2341e0a 1197 log_unit_debug(u, "Failed to parse reload result value: %s", value);
9d2f5178
LP
1198 else if (f != MOUNT_SUCCESS)
1199 m->reload_result = f;
a16e1123
LP
1200
1201 } else if (streq(key, "control-pid")) {
5925dd3c 1202 pid_t pid;
a16e1123 1203
e364ad06 1204 if (parse_pid(value, &pid) < 0)
f2341e0a 1205 log_unit_debug(u, "Failed to parse control-pid value: %s", value);
a16e1123 1206 else
5925dd3c 1207 m->control_pid = pid;
a16e1123
LP
1208 } else if (streq(key, "control-command")) {
1209 MountExecCommand id;
1210
f2341e0a
LP
1211 id = mount_exec_command_from_string(value);
1212 if (id < 0)
1213 log_unit_debug(u, "Failed to parse exec-command value: %s", value);
a16e1123
LP
1214 else {
1215 m->control_command_id = id;
1216 m->control_command = m->exec_command + id;
1217 }
a16e1123 1218 } else
f2341e0a 1219 log_unit_debug(u, "Unknown serialization key: %s", key);
a16e1123
LP
1220
1221 return 0;
1222}
1223
44a6b1b6 1224_pure_ static UnitActiveState mount_active_state(Unit *u) {
e537352b
LP
1225 assert(u);
1226
1227 return state_translation_table[MOUNT(u)->state];
1228}
1229
44a6b1b6 1230_pure_ static const char *mount_sub_state_to_string(Unit *u) {
10a94420
LP
1231 assert(u);
1232
a16e1123 1233 return mount_state_to_string(MOUNT(u)->state);
10a94420
LP
1234}
1235
44a6b1b6 1236_pure_ static bool mount_check_gc(Unit *u) {
701cc384
LP
1237 Mount *m = MOUNT(u);
1238
1239 assert(m);
1240
6b1dc2bd 1241 return m->from_proc_self_mountinfo;
701cc384
LP
1242}
1243
e537352b
LP
1244static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1245 Mount *m = MOUNT(u);
9d2f5178 1246 MountResult f;
e537352b
LP
1247
1248 assert(m);
1249 assert(pid >= 0);
1250
8c47c732
LP
1251 if (pid != m->control_pid)
1252 return;
e537352b 1253
e537352b
LP
1254 m->control_pid = 0;
1255
1f0958f6 1256 if (is_clean_exit(code, status, EXIT_CLEAN_COMMAND, NULL))
9d2f5178
LP
1257 f = MOUNT_SUCCESS;
1258 else if (code == CLD_EXITED)
1259 f = MOUNT_FAILURE_EXIT_CODE;
1260 else if (code == CLD_KILLED)
1261 f = MOUNT_FAILURE_SIGNAL;
1262 else if (code == CLD_DUMPED)
1263 f = MOUNT_FAILURE_CORE_DUMP;
1264 else
1265 assert_not_reached("Unknown code");
1266
850b7410
LP
1267 if (IN_SET(m->state, MOUNT_REMOUNTING, MOUNT_REMOUNTING_SIGKILL, MOUNT_REMOUNTING_SIGTERM))
1268 mount_set_reload_result(m, f);
1269 else if (m->result == MOUNT_SUCCESS)
9d2f5178 1270 m->result = f;
8c47c732 1271
a16e1123 1272 if (m->control_command) {
6ea832a2 1273 exec_status_exit(&m->control_command->exec_status, &m->exec_context, pid, code, status);
9d2f5178 1274
a16e1123
LP
1275 m->control_command = NULL;
1276 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
1277 }
1278
f2341e0a
LP
1279 log_unit_full(u, f == MOUNT_SUCCESS ? LOG_DEBUG : LOG_NOTICE, 0,
1280 "Mount process exited, code=%s status=%i", sigchld_code_to_string(code), status);
e537352b 1281
006aabbd
AJ
1282 /* Note that due to the io event priority logic, we can be sure the new mountinfo is loaded
1283 * before we process the SIGCHLD for the mount command. */
e537352b
LP
1284
1285 switch (m->state) {
1286
1287 case MOUNT_MOUNTING:
006aabbd 1288 /* Our mount point has not appeared in mountinfo. Something went wrong. */
e537352b 1289
006aabbd
AJ
1290 if (f == MOUNT_SUCCESS) {
1291 /* Either /bin/mount has an unexpected definition of success,
1292 * or someone raced us and we lost. */
1293 log_unit_warning(UNIT(m), "Mount process finished, but there is no mount.");
1294 f = MOUNT_FAILURE_PROTOCOL;
1295 }
1296 mount_enter_dead(m, f);
1297 break;
1298
1299 case MOUNT_MOUNTING_DONE:
1300 mount_enter_mounted(m, f);
e537352b
LP
1301 break;
1302
e2f3b44c 1303 case MOUNT_REMOUNTING:
e2f3b44c 1304 case MOUNT_REMOUNTING_SIGTERM:
22af0e58
LP
1305 case MOUNT_REMOUNTING_SIGKILL:
1306 mount_enter_dead_or_mounted(m, MOUNT_SUCCESS);
e2f3b44c
LP
1307 break;
1308
e537352b 1309 case MOUNT_UNMOUNTING:
e537352b 1310
3cc96856 1311 if (f == MOUNT_SUCCESS && m->from_proc_self_mountinfo) {
22af0e58
LP
1312
1313 /* Still a mount point? If so, let's try again. Most likely there were multiple mount points
57018361
AJ
1314 * stacked on top of each other. We might exceed the timeout specified by the user overall,
1315 * but we will stop as soon as any one umount times out. */
22af0e58
LP
1316
1317 if (m->n_retry_umount < RETRY_UMOUNT_MAX) {
1318 log_unit_debug(u, "Mount still present, trying again.");
1319 m->n_retry_umount++;
1320 mount_enter_unmounting(m);
1321 } else {
006aabbd 1322 log_unit_warning(u, "Mount still present after %u attempts to unmount, giving up.", m->n_retry_umount);
22af0e58
LP
1323 mount_enter_mounted(m, f);
1324 }
1325 } else
3cc96856 1326 mount_enter_dead_or_mounted(m, f);
22af0e58 1327
e537352b 1328 break;
57018361
AJ
1329
1330 case MOUNT_UNMOUNTING_SIGKILL:
1331 case MOUNT_UNMOUNTING_SIGTERM:
1332 mount_enter_dead_or_mounted(m, f);
1333 break;
e537352b
LP
1334
1335 default:
1336 assert_not_reached("Uh, control process died at wrong time.");
1337 }
c4e2ceae
LP
1338
1339 /* Notify clients about changed exit status */
1340 unit_add_to_dbus_queue(u);
e537352b
LP
1341}
1342
718db961
LP
1343static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata) {
1344 Mount *m = MOUNT(userdata);
e537352b
LP
1345
1346 assert(m);
718db961 1347 assert(m->timer_event_source == source);
e537352b
LP
1348
1349 switch (m->state) {
1350
1351 case MOUNT_MOUNTING:
1352 case MOUNT_MOUNTING_DONE:
22af0e58
LP
1353 log_unit_warning(UNIT(m), "Mounting timed out. Terminating.");
1354 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
e537352b
LP
1355 break;
1356
1357 case MOUNT_REMOUNTING:
79aafbd1 1358 log_unit_warning(UNIT(m), "Remounting timed out. Terminating remount process.");
22af0e58
LP
1359 mount_set_reload_result(m, MOUNT_FAILURE_TIMEOUT);
1360 mount_enter_signal(m, MOUNT_REMOUNTING_SIGTERM, MOUNT_SUCCESS);
e537352b
LP
1361 break;
1362
22af0e58
LP
1363 case MOUNT_REMOUNTING_SIGTERM:
1364 mount_set_reload_result(m, MOUNT_FAILURE_TIMEOUT);
e537352b 1365
4819ff03 1366 if (m->kill_context.send_sigkill) {
22af0e58
LP
1367 log_unit_warning(UNIT(m), "Remounting timed out. Killing.");
1368 mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_SUCCESS);
ba035df2 1369 } else {
22af0e58
LP
1370 log_unit_warning(UNIT(m), "Remounting timed out. Skipping SIGKILL. Ignoring.");
1371 mount_enter_dead_or_mounted(m, MOUNT_SUCCESS);
ba035df2 1372 }
e537352b
LP
1373 break;
1374
22af0e58
LP
1375 case MOUNT_REMOUNTING_SIGKILL:
1376 mount_set_reload_result(m, MOUNT_FAILURE_TIMEOUT);
ba035df2 1377
22af0e58
LP
1378 log_unit_warning(UNIT(m), "Mount process still around after SIGKILL. Ignoring.");
1379 mount_enter_dead_or_mounted(m, MOUNT_SUCCESS);
1380 break;
1381
1382 case MOUNT_UNMOUNTING:
79aafbd1 1383 log_unit_warning(UNIT(m), "Unmounting timed out. Terminating.");
22af0e58 1384 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
e537352b
LP
1385 break;
1386
1387 case MOUNT_UNMOUNTING_SIGTERM:
4819ff03 1388 if (m->kill_context.send_sigkill) {
22af0e58 1389 log_unit_warning(UNIT(m), "Mount process timed out. Killing.");
9d2f5178 1390 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
ba035df2 1391 } else {
22af0e58
LP
1392 log_unit_warning(UNIT(m), "Mount process timed out. Skipping SIGKILL. Ignoring.");
1393 mount_enter_dead_or_mounted(m, MOUNT_FAILURE_TIMEOUT);
ba035df2 1394 }
e537352b
LP
1395 break;
1396
e537352b 1397 case MOUNT_UNMOUNTING_SIGKILL:
22af0e58
LP
1398 log_unit_warning(UNIT(m), "Mount process still around after SIGKILL. Ignoring.");
1399 mount_enter_dead_or_mounted(m, MOUNT_FAILURE_TIMEOUT);
e537352b
LP
1400 break;
1401
1402 default:
1403 assert_not_reached("Timeout at wrong time.");
1404 }
718db961
LP
1405
1406 return 0;
e537352b
LP
1407}
1408
03b8cfed
FB
1409typedef struct {
1410 bool is_mounted;
1411 bool just_mounted;
1412 bool just_changed;
1413} MountSetupFlags;
1414
1415static int mount_setup_new_unit(
1416 Unit *u,
1417 const char *what,
1418 const char *where,
1419 const char *options,
1420 const char *fstype,
1421 MountSetupFlags *flags) {
1422
1423 MountParameters *p;
1424
1425 assert(u);
1426 assert(flags);
1427
1428 u->source_path = strdup("/proc/self/mountinfo");
1429 MOUNT(u)->where = strdup(where);
a51ee72d 1430 if (!u->source_path || !MOUNT(u)->where)
03b8cfed
FB
1431 return -ENOMEM;
1432
1433 /* Make sure to initialize those fields before mount_is_extrinsic(). */
1434 MOUNT(u)->from_proc_self_mountinfo = true;
1435 p = &MOUNT(u)->parameters_proc_self_mountinfo;
1436
1437 p->what = strdup(what);
1438 p->options = strdup(options);
1439 p->fstype = strdup(fstype);
1440 if (!p->what || !p->options || !p->fstype)
1441 return -ENOMEM;
1442
1443 if (!mount_is_extrinsic(MOUNT(u))) {
1444 const char *target;
1445 int r;
1446
1447 target = mount_is_network(p) ? SPECIAL_REMOTE_FS_TARGET : SPECIAL_LOCAL_FS_TARGET;
eef85c4a 1448 r = unit_add_dependency_by_name(u, UNIT_BEFORE, target, NULL, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT);
03b8cfed
FB
1449 if (r < 0)
1450 return r;
1451
eef85c4a 1452 r = unit_add_dependency_by_name(u, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT);
03b8cfed
FB
1453 if (r < 0)
1454 return r;
1455 }
1456
cfcd4318 1457 unit_add_to_load_queue(u);
03b8cfed
FB
1458 flags->is_mounted = true;
1459 flags->just_mounted = true;
1460 flags->just_changed = true;
1461
1462 return 0;
1463}
1464
1465static int mount_setup_existing_unit(
1466 Unit *u,
1467 const char *what,
1468 const char *where,
1469 const char *options,
1470 const char *fstype,
1471 MountSetupFlags *flags) {
1472
1473 MountParameters *p;
1474 bool load_extras = false;
1475 int r1, r2, r3;
1476
1477 assert(u);
1478 assert(flags);
1479
1480 if (!MOUNT(u)->where) {
1481 MOUNT(u)->where = strdup(where);
1482 if (!MOUNT(u)->where)
1483 return -ENOMEM;
1484 }
1485
1486 /* Make sure to initialize those fields before mount_is_extrinsic(). */
1487 p = &MOUNT(u)->parameters_proc_self_mountinfo;
1488
1489 r1 = free_and_strdup(&p->what, what);
1490 r2 = free_and_strdup(&p->options, options);
1491 r3 = free_and_strdup(&p->fstype, fstype);
1492 if (r1 < 0 || r2 < 0 || r3 < 0)
1493 return -ENOMEM;
1494
1495 flags->just_changed = r1 > 0 || r2 > 0 || r3 > 0;
1496 flags->is_mounted = true;
65d36b49 1497 flags->just_mounted = !MOUNT(u)->from_proc_self_mountinfo || MOUNT(u)->just_mounted;
03b8cfed
FB
1498
1499 MOUNT(u)->from_proc_self_mountinfo = true;
1500
1501 if (!mount_is_extrinsic(MOUNT(u)) && mount_is_network(p)) {
1502 /* _netdev option may have shown up late, or on a
1503 * remount. Add remote-fs dependencies, even though
1504 * local-fs ones may already be there.
1505 *
1506 * Note: due to a current limitation (we don't track
1507 * in the dependency "Set*" objects who created a
1508 * dependency), we can only add deps, never lose them,
1509 * until the next full daemon-reload. */
eef85c4a 1510 unit_add_dependency_by_name(u, UNIT_BEFORE, SPECIAL_REMOTE_FS_TARGET, NULL, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT);
03b8cfed
FB
1511 load_extras = true;
1512 }
1513
1514 if (u->load_state == UNIT_NOT_FOUND) {
1515 u->load_state = UNIT_LOADED;
1516 u->load_error = 0;
1517
1518 /* Load in the extras later on, after we
1519 * finished initialization of the unit */
1520
1521 /* FIXME: since we're going to load the unit later on, why setting load_extras=true ? */
1522 load_extras = true;
1523 flags->just_changed = true;
1524 }
1525
1526 if (load_extras)
1527 return mount_add_extras(MOUNT(u));
1528
1529 return 0;
1530}
1531
628c89cc 1532static int mount_setup_unit(
e537352b
LP
1533 Manager *m,
1534 const char *what,
1535 const char *where,
1536 const char *options,
1537 const char *fstype,
e537352b 1538 bool set_flags) {
057d9ab8 1539
03b8cfed
FB
1540 _cleanup_free_ char *e = NULL;
1541 MountSetupFlags flags;
057d9ab8
LP
1542 Unit *u;
1543 int r;
b08d03ff 1544
f50e0a01 1545 assert(m);
b08d03ff
LP
1546 assert(what);
1547 assert(where);
e537352b
LP
1548 assert(options);
1549 assert(fstype);
1550
e537352b
LP
1551 /* Ignore API mount points. They should never be referenced in
1552 * dependencies ever. */
33ff02c9 1553 if (mount_point_is_api(where) || mount_point_ignore(where))
57f2a956 1554 return 0;
b08d03ff 1555
8d567588
LP
1556 if (streq(fstype, "autofs"))
1557 return 0;
1558
4e85aff4
LP
1559 /* probably some kind of swap, ignore */
1560 if (!is_path(where))
b08d03ff
LP
1561 return 0;
1562
7410616c
LP
1563 r = unit_name_from_path(where, ".mount", &e);
1564 if (r < 0)
1565 return r;
b08d03ff 1566
7d17cfbc
MS
1567 u = manager_get_unit(m, e);
1568 if (!u) {
03b8cfed
FB
1569 /* First time we see this mount point meaning that it's
1570 * not been initiated by a mount unit but rather by the
1571 * sysadmin having called mount(8) directly. */
a581e45a 1572 r = unit_new_for_name(m, sizeof(Mount), e, &u);
b08d03ff
LP
1573 if (r < 0)
1574 goto fail;
1575
03b8cfed
FB
1576 r = mount_setup_new_unit(u, what, where, options, fstype, &flags);
1577 if (r < 0)
1578 unit_free(u);
1579 } else
1580 r = mount_setup_existing_unit(u, what, where, options, fstype, &flags);
b08d03ff 1581
03b8cfed 1582 if (r < 0)
e537352b 1583 goto fail;
ff5f34d0 1584
6b1dc2bd 1585 if (set_flags) {
03b8cfed
FB
1586 MOUNT(u)->is_mounted = flags.is_mounted;
1587 MOUNT(u)->just_mounted = flags.just_mounted;
1588 MOUNT(u)->just_changed = flags.just_changed;
b87705cd
LP
1589 }
1590
03b8cfed 1591 if (flags.just_changed)
ff5f34d0 1592 unit_add_to_dbus_queue(u);
c1e1601e 1593
b08d03ff 1594 return 0;
b08d03ff 1595fail:
628c89cc 1596 log_warning_errno(r, "Failed to set up mount unit: %m");
4e85aff4 1597 return r;
b08d03ff
LP
1598}
1599
ef734fd6 1600static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
628c89cc
LP
1601 _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL;
1602 _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL;
60b912f6 1603 int r = 0;
b08d03ff
LP
1604
1605 assert(m);
1606
628c89cc
LP
1607 t = mnt_new_table();
1608 if (!t)
8d3ae2bd 1609 return log_oom();
b08d03ff 1610
628c89cc
LP
1611 i = mnt_new_iter(MNT_ITER_FORWARD);
1612 if (!i)
1613 return log_oom();
1614
1615 r = mnt_table_parse_mtab(t, NULL);
5cca8def 1616 if (r < 0)
628c89cc 1617 return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m");
e537352b 1618
5cca8def
ZJS
1619 r = 0;
1620 for (;;) {
8d3ae2bd 1621 const char *device, *path, *options, *fstype;
527b7a42 1622 _cleanup_free_ char *d = NULL, *p = NULL;
628c89cc 1623 struct libmnt_fs *fs;
8d3ae2bd 1624 int k;
b08d03ff 1625
628c89cc 1626 k = mnt_table_next_fs(t, i, &fs);
5cca8def
ZJS
1627 if (k == 1)
1628 break;
628c89cc
LP
1629 if (k < 0)
1630 return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m");
5cca8def 1631
8d3ae2bd
CL
1632 device = mnt_fs_get_source(fs);
1633 path = mnt_fs_get_target(fs);
1634 options = mnt_fs_get_options(fs);
1635 fstype = mnt_fs_get_fstype(fs);
a2e0f3d3 1636
c0a7f8d3
DM
1637 if (!device || !path)
1638 continue;
1639
527b7a42 1640 if (cunescape(device, UNESCAPE_RELAX, &d) < 0)
628c89cc
LP
1641 return log_oom();
1642
527b7a42 1643 if (cunescape(path, UNESCAPE_RELAX, &p) < 0)
a57f7e2c 1644 return log_oom();
b08d03ff 1645
628c89cc
LP
1646 (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags);
1647
1648 k = mount_setup_unit(m, d, p, options, fstype, set_flags);
5cca8def 1649 if (r == 0 && k < 0)
60b912f6 1650 r = k;
b08d03ff
LP
1651 }
1652
e537352b
LP
1653 return r;
1654}
1655
1656static void mount_shutdown(Manager *m) {
1657 assert(m);
1658
718db961
LP
1659 m->mount_event_source = sd_event_source_unref(m->mount_event_source);
1660
d379d442
KZ
1661 mnt_unref_monitor(m->mount_monitor);
1662 m->mount_monitor = NULL;
b08d03ff
LP
1663}
1664
7a7821c8 1665static int mount_get_timeout(Unit *u, usec_t *timeout) {
68db7a3b 1666 Mount *m = MOUNT(u);
7a7821c8 1667 usec_t t;
68db7a3b
ZJS
1668 int r;
1669
1670 if (!m->timer_event_source)
1671 return 0;
1672
7a7821c8 1673 r = sd_event_source_get_time(m->timer_event_source, &t);
68db7a3b
ZJS
1674 if (r < 0)
1675 return r;
7a7821c8
LP
1676 if (t == USEC_INFINITY)
1677 return 0;
68db7a3b 1678
7a7821c8 1679 *timeout = t;
68db7a3b
ZJS
1680 return 1;
1681}
1682
1201cae7 1683static int synthesize_root_mount(Manager *m) {
11222d0f
LP
1684 Unit *u;
1685 int r;
1686
1687 assert(m);
1688
1689 /* Whatever happens, we know for sure that the root directory is around, and cannot go away. Let's
1690 * unconditionally synthesize it here and mark it as perpetual. */
1691
1692 u = manager_get_unit(m, SPECIAL_ROOT_MOUNT);
1693 if (!u) {
a581e45a 1694 r = unit_new_for_name(m, sizeof(Mount), SPECIAL_ROOT_MOUNT, &u);
1201cae7
LP
1695 if (r < 0)
1696 return log_error_errno(r, "Failed to allocate the special " SPECIAL_ROOT_MOUNT " unit: %m");
11222d0f
LP
1697 }
1698
1699 u->perpetual = true;
1700 MOUNT(u)->deserialized_state = MOUNT_MOUNTED;
1701
1702 unit_add_to_load_queue(u);
1703 unit_add_to_dbus_queue(u);
1201cae7
LP
1704
1705 return 0;
11222d0f
LP
1706}
1707
1708static bool mount_is_mounted(Mount *m) {
1709 assert(m);
1710
1711 return UNIT(m)->perpetual || m->is_mounted;
1712}
1713
ba64af90 1714static void mount_enumerate(Manager *m) {
b08d03ff 1715 int r;
d379d442 1716
b08d03ff
LP
1717 assert(m);
1718
1201cae7
LP
1719 r = synthesize_root_mount(m);
1720 if (r < 0)
1721 goto fail;
11222d0f 1722
8d3ae2bd
CL
1723 mnt_init_debug(0);
1724
d379d442
KZ
1725 if (!m->mount_monitor) {
1726 int fd;
ef734fd6 1727
d379d442
KZ
1728 m->mount_monitor = mnt_new_monitor();
1729 if (!m->mount_monitor) {
ba64af90 1730 log_oom();
718db961 1731 goto fail;
d379d442 1732 }
29083707 1733
d379d442 1734 r = mnt_monitor_enable_kernel(m->mount_monitor, 1);
ba64af90
LP
1735 if (r < 0) {
1736 log_error_errno(r, "Failed to enable watching of kernel mount events: %m");
29083707 1737 goto fail;
ba64af90
LP
1738 }
1739
d379d442 1740 r = mnt_monitor_enable_userspace(m->mount_monitor, 1, NULL);
ba64af90
LP
1741 if (r < 0) {
1742 log_error_errno(r, "Failed to enable watching of userspace mount events: %m");
f7c1ad4f 1743 goto fail;
ba64af90 1744 }
90598531 1745
d379d442
KZ
1746 /* mnt_unref_monitor() will close the fd */
1747 fd = r = mnt_monitor_get_fd(m->mount_monitor);
ba64af90
LP
1748 if (r < 0) {
1749 log_error_errno(r, "Failed to acquire watch file descriptor: %m");
f7c1ad4f 1750 goto fail;
ba64af90 1751 }
befb6d54 1752
d379d442 1753 r = sd_event_add_io(m->event, &m->mount_event_source, fd, EPOLLIN, mount_dispatch_io, m);
ba64af90
LP
1754 if (r < 0) {
1755 log_error_errno(r, "Failed to watch mount file descriptor: %m");
befb6d54 1756 goto fail;
ba64af90 1757 }
befb6d54 1758
83231637 1759 r = sd_event_source_set_priority(m->mount_event_source, SD_EVENT_PRIORITY_NORMAL-10);
ba64af90
LP
1760 if (r < 0) {
1761 log_error_errno(r, "Failed to adjust mount watch priority: %m");
befb6d54 1762 goto fail;
ba64af90 1763 }
7dfbe2e3 1764
d379d442 1765 (void) sd_event_source_set_description(m->mount_event_source, "mount-monitor-dispatch");
befb6d54
CL
1766 }
1767
e62d8c39
ZJS
1768 r = mount_load_proc_self_mountinfo(m, false);
1769 if (r < 0)
b08d03ff
LP
1770 goto fail;
1771
ba64af90 1772 return;
b08d03ff
LP
1773
1774fail:
1775 mount_shutdown(m);
5cb5a6ff
LP
1776}
1777
718db961 1778static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
fcd8b266 1779 _cleanup_set_free_ Set *around = NULL, *gone = NULL;
718db961 1780 Manager *m = userdata;
fcd8b266
LP
1781 const char *what;
1782 Iterator i;
595ed347 1783 Unit *u;
ef734fd6
LP
1784 int r;
1785
1786 assert(m);
d379d442 1787 assert(revents & EPOLLIN);
ef734fd6 1788
d379d442 1789 if (fd == mnt_monitor_get_fd(m->mount_monitor)) {
df63dda6 1790 bool rescan = false;
befb6d54 1791
d379d442
KZ
1792 /* Drain all events and verify that the event is valid.
1793 *
1794 * Note that libmount also monitors /run/mount mkdir if the
1795 * directory does not exist yet. The mkdir may generate event
1796 * which is irrelevant for us.
1797 *
1798 * error: r < 0; valid: r == 0, false positive: rc == 1 */
1799 do {
1800 r = mnt_monitor_next_change(m->mount_monitor, NULL, NULL);
1801 if (r == 0)
1802 rescan = true;
1803 else if (r < 0)
1804 return log_error_errno(r, "Failed to drain libmount events");
1805 } while (r == 0);
1806
1807 log_debug("libmount event [rescan: %s]", yes_no(rescan));
befb6d54
CL
1808 if (!rescan)
1809 return 0;
1810 }
ef734fd6 1811
4f0eedb7
ZJS
1812 r = mount_load_proc_self_mountinfo(m, true);
1813 if (r < 0) {
e537352b 1814 /* Reset flags, just in case, for later calls */
595ed347
MS
1815 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1816 Mount *mount = MOUNT(u);
e537352b
LP
1817
1818 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1819 }
1820
718db961 1821 return 0;
ef734fd6
LP
1822 }
1823
1824 manager_dispatch_load_queue(m);
1825
595ed347
MS
1826 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1827 Mount *mount = MOUNT(u);
ef734fd6 1828
11222d0f 1829 if (!mount_is_mounted(mount)) {
e537352b 1830
394763f6
LP
1831 /* A mount point is not around right now. It
1832 * might be gone, or might never have
1833 * existed. */
1834
1835 if (mount->from_proc_self_mountinfo &&
1836 mount->parameters_proc_self_mountinfo.what) {
1837
1838 /* Remember that this device might just have disappeared */
1839 if (set_ensure_allocated(&gone, &string_hash_ops) < 0 ||
1840 set_put(gone, mount->parameters_proc_self_mountinfo.what) < 0)
1841 log_oom(); /* we don't care too much about OOM here... */
1842 }
fcd8b266 1843
ef734fd6 1844 mount->from_proc_self_mountinfo = false;
e537352b
LP
1845
1846 switch (mount->state) {
1847
1848 case MOUNT_MOUNTED:
aef83136
LP
1849 /* This has just been unmounted by
1850 * somebody else, follow the state
1851 * change. */
cf6f7f66 1852 mount->result = MOUNT_SUCCESS; /* make sure we forget any earlier umount failures */
9d2f5178 1853 mount_enter_dead(mount, MOUNT_SUCCESS);
e537352b
LP
1854 break;
1855
1856 default:
e537352b 1857 break;
e537352b
LP
1858 }
1859
1860 } else if (mount->just_mounted || mount->just_changed) {
1861
fcd8b266 1862 /* A mount point was added or changed */
e537352b
LP
1863
1864 switch (mount->state) {
1865
1866 case MOUNT_DEAD:
fdf20a31 1867 case MOUNT_FAILED:
4b58153d
LP
1868
1869 /* This has just been mounted by somebody else, follow the state change, but let's
1870 * generate a new invocation ID for this implicitly and automatically. */
1871 (void) unit_acquire_invocation_id(UNIT(mount));
9d2f5178 1872 mount_enter_mounted(mount, MOUNT_SUCCESS);
e537352b
LP
1873 break;
1874
1875 case MOUNT_MOUNTING:
5bcb0f2b 1876 mount_set_state(mount, MOUNT_MOUNTING_DONE);
e537352b
LP
1877 break;
1878
1879 default:
1880 /* Nothing really changed, but let's
1881 * issue an notification call
1882 * nonetheless, in case somebody is
1883 * waiting for this. (e.g. file system
1884 * ro/rw remounts.) */
1885 mount_set_state(mount, mount->state);
1886 break;
1887 }
394763f6 1888 }
fcd8b266 1889
11222d0f 1890 if (mount_is_mounted(mount) &&
394763f6
LP
1891 mount->from_proc_self_mountinfo &&
1892 mount->parameters_proc_self_mountinfo.what) {
fcd8b266 1893
394763f6
LP
1894 if (set_ensure_allocated(&around, &string_hash_ops) < 0 ||
1895 set_put(around, mount->parameters_proc_self_mountinfo.what) < 0)
1896 log_oom();
e537352b
LP
1897 }
1898
1899 /* Reset the flags for later calls */
1900 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1901 }
718db961 1902
fcd8b266
LP
1903 SET_FOREACH(what, gone, i) {
1904 if (set_contains(around, what))
1905 continue;
1906
1907 /* Let the device units know that the device is no longer mounted */
1908 (void) device_found_node(m, what, false, DEVICE_FOUND_MOUNT, true);
1909 }
1910
718db961 1911 return 0;
e537352b
LP
1912}
1913
fdf20a31 1914static void mount_reset_failed(Unit *u) {
5632e374
LP
1915 Mount *m = MOUNT(u);
1916
1917 assert(m);
1918
fdf20a31 1919 if (m->state == MOUNT_FAILED)
5632e374
LP
1920 mount_set_state(m, MOUNT_DEAD);
1921
9d2f5178
LP
1922 m->result = MOUNT_SUCCESS;
1923 m->reload_result = MOUNT_SUCCESS;
5632e374
LP
1924}
1925
718db961 1926static int mount_kill(Unit *u, KillWho who, int signo, sd_bus_error *error) {
22af0e58
LP
1927 Mount *m = MOUNT(u);
1928
1929 assert(m);
1930
814cc562 1931 return unit_kill_common(u, who, signo, -1, MOUNT(u)->control_pid, error);
8a0867d6
LP
1932}
1933
291d565a
LP
1934static int mount_control_pid(Unit *u) {
1935 Mount *m = MOUNT(u);
1936
1937 assert(m);
1938
1939 return m->control_pid;
1940}
1941
a16e1123
LP
1942static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = {
1943 [MOUNT_EXEC_MOUNT] = "ExecMount",
1944 [MOUNT_EXEC_UNMOUNT] = "ExecUnmount",
1945 [MOUNT_EXEC_REMOUNT] = "ExecRemount",
1946};
1947
1948DEFINE_STRING_TABLE_LOOKUP(mount_exec_command, MountExecCommand);
1949
9d2f5178
LP
1950static const char* const mount_result_table[_MOUNT_RESULT_MAX] = {
1951 [MOUNT_SUCCESS] = "success",
1952 [MOUNT_FAILURE_RESOURCES] = "resources",
1953 [MOUNT_FAILURE_TIMEOUT] = "timeout",
1954 [MOUNT_FAILURE_EXIT_CODE] = "exit-code",
1955 [MOUNT_FAILURE_SIGNAL] = "signal",
07299350
LP
1956 [MOUNT_FAILURE_CORE_DUMP] = "core-dump",
1957 [MOUNT_FAILURE_START_LIMIT_HIT] = "start-limit-hit",
006aabbd 1958 [MOUNT_FAILURE_PROTOCOL] = "protocol",
9d2f5178
LP
1959};
1960
1961DEFINE_STRING_TABLE_LOOKUP(mount_result, MountResult);
1962
87f0e418 1963const UnitVTable mount_vtable = {
7d17cfbc 1964 .object_size = sizeof(Mount),
718db961
LP
1965 .exec_context_offset = offsetof(Mount, exec_context),
1966 .cgroup_context_offset = offsetof(Mount, cgroup_context),
1967 .kill_context_offset = offsetof(Mount, kill_context),
613b411c 1968 .exec_runtime_offset = offsetof(Mount, exec_runtime),
29206d46 1969 .dynamic_creds_offset = offsetof(Mount, dynamic_creds),
3ef63c31 1970
f975e971
LP
1971 .sections =
1972 "Unit\0"
1973 "Mount\0"
1974 "Install\0",
4ad49000 1975 .private_section = "Mount",
71645aca 1976
e537352b
LP
1977 .init = mount_init,
1978 .load = mount_load,
034c6ed7 1979 .done = mount_done,
e537352b 1980
f50e0a01
LP
1981 .coldplug = mount_coldplug,
1982
034c6ed7 1983 .dump = mount_dump,
5cb5a6ff 1984
e537352b
LP
1985 .start = mount_start,
1986 .stop = mount_stop,
1987 .reload = mount_reload,
1988
8a0867d6
LP
1989 .kill = mount_kill,
1990
a16e1123
LP
1991 .serialize = mount_serialize,
1992 .deserialize_item = mount_deserialize_item,
1993
f50e0a01 1994 .active_state = mount_active_state,
10a94420 1995 .sub_state_to_string = mount_sub_state_to_string,
b08d03ff 1996
701cc384
LP
1997 .check_gc = mount_check_gc,
1998
e537352b 1999 .sigchld_event = mount_sigchld_event,
e537352b 2000
fdf20a31 2001 .reset_failed = mount_reset_failed,
291d565a
LP
2002
2003 .control_pid = mount_control_pid,
5632e374 2004
718db961 2005 .bus_vtable = bus_mount_vtable,
74c964d3
LP
2006 .bus_set_property = bus_mount_set_property,
2007 .bus_commit_properties = bus_mount_commit_properties,
4139c1b2 2008
68db7a3b
ZJS
2009 .get_timeout = mount_get_timeout,
2010
0e252f6b
TG
2011 .can_transient = true,
2012
f50e0a01 2013 .enumerate = mount_enumerate,
c6918296
MS
2014 .shutdown = mount_shutdown,
2015
2016 .status_message_formats = {
2017 .starting_stopping = {
2018 [0] = "Mounting %s...",
2019 [1] = "Unmounting %s...",
2020 },
2021 .finished_start_job = {
2022 [JOB_DONE] = "Mounted %s.",
2023 [JOB_FAILED] = "Failed to mount %s.",
c6918296
MS
2024 [JOB_TIMEOUT] = "Timed out mounting %s.",
2025 },
2026 .finished_stop_job = {
2027 [JOB_DONE] = "Unmounted %s.",
2028 [JOB_FAILED] = "Failed unmounting %s.",
2029 [JOB_TIMEOUT] = "Timed out unmounting %s.",
2030 },
2031 },
5cb5a6ff 2032};