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