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