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