1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
24 #include <sys/mount.h>
27 #include <sys/epoll.h>
29 #include <linux/auto_fs4.h>
30 #include <linux/auto_dev-ioctl.h>
33 #include "automount.h"
34 #include "load-fragment.h"
35 #include "load-dropin.h"
36 #include "unit-name.h"
37 #include "dbus-automount.h"
38 #include "bus-errors.h"
42 #include "path-util.h"
44 static const UnitActiveState state_translation_table[_AUTOMOUNT_STATE_MAX] = {
45 [AUTOMOUNT_DEAD] = UNIT_INACTIVE,
46 [AUTOMOUNT_WAITING] = UNIT_ACTIVE,
47 [AUTOMOUNT_RUNNING] = UNIT_ACTIVE,
48 [AUTOMOUNT_FAILED] = UNIT_FAILED
51 static int open_dev_autofs(Manager *m);
53 static void automount_init(Unit *u) {
54 Automount *a = AUTOMOUNT(u);
57 assert(u->load_state == UNIT_STUB);
59 a->pipe_watch.fd = a->pipe_fd = -1;
60 a->pipe_watch.type = WATCH_INVALID;
62 a->directory_mode = 0755;
64 UNIT(a)->ignore_on_isolate = true;
67 static void repeat_unmout(const char *path) {
71 /* If there are multiple mounts on a mount point, this
74 if (umount2(path, MNT_DETACH) >= 0)
78 log_error("Failed to unmount: %m");
84 static void unmount_autofs(Automount *a) {
90 automount_send_ready(a, -EHOSTDOWN);
92 unit_unwatch_fd(UNIT(a), &a->pipe_watch);
93 close_nointr_nofail(a->pipe_fd);
96 /* If we reload/reexecute things we keep the mount point
99 (UNIT(a)->manager->exit_code != MANAGER_RELOAD &&
100 UNIT(a)->manager->exit_code != MANAGER_REEXECUTE))
101 repeat_unmout(a->where);
104 static void automount_done(Unit *u) {
105 Automount *a = AUTOMOUNT(u);
110 unit_ref_unset(&a->mount);
119 int automount_add_one_mount_link(Automount *a, Mount *m) {
125 if (UNIT(a)->load_state != UNIT_LOADED ||
126 UNIT(m)->load_state != UNIT_LOADED)
129 if (!path_startswith(a->where, m->where))
132 if (path_equal(a->where, m->where))
135 r = unit_add_two_dependencies(UNIT(a), UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true);
142 static int automount_add_mount_links(Automount *a) {
148 LIST_FOREACH(units_by_type, other, UNIT(a)->manager->units_by_type[UNIT_MOUNT]) {
149 r = automount_add_one_mount_link(a, MOUNT(other));
157 static int automount_add_default_dependencies(Automount *a) {
162 if (UNIT(a)->manager->running_as != SYSTEMD_SYSTEM)
165 r = unit_add_two_dependencies_by_name(UNIT(a), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
172 static int automount_verify(Automount *a) {
177 if (UNIT(a)->load_state != UNIT_LOADED)
180 if (path_equal(a->where, "/")) {
181 log_error("Cannot have an automount unit for the root directory. Refusing.");
185 e = unit_name_from_path(a->where, ".automount");
189 b = unit_has_name(UNIT(a), e);
193 log_error("%s's Where setting doesn't match unit name. Refusing.", UNIT(a)->id);
200 static int automount_load(Unit *u) {
202 Automount *a = AUTOMOUNT(u);
205 assert(u->load_state == UNIT_STUB);
207 /* Load a .automount file */
208 r = unit_load_fragment_and_dropin_optional(u);
212 if (u->load_state == UNIT_LOADED) {
216 a->where = unit_name_to_path(u->id);
221 path_kill_slashes(a->where);
223 r = automount_add_mount_links(a);
227 r = unit_load_related_unit(u, ".mount", &x);
231 unit_ref_set(&a->mount, x);
233 r = unit_add_two_dependencies(u, UNIT_BEFORE, UNIT_TRIGGERS, UNIT_DEREF(a->mount), true);
237 if (UNIT(a)->default_dependencies) {
238 r = automount_add_default_dependencies(a);
244 return automount_verify(a);
247 static void automount_set_state(Automount *a, AutomountState state) {
248 AutomountState old_state;
251 old_state = a->state;
254 if (state != AUTOMOUNT_WAITING &&
255 state != AUTOMOUNT_RUNNING)
258 if (state != old_state)
259 log_debug("%s changed %s -> %s",
261 automount_state_to_string(old_state),
262 automount_state_to_string(state));
264 unit_notify(UNIT(a), state_translation_table[old_state], state_translation_table[state], true);
267 static int automount_coldplug(Unit *u) {
268 Automount *a = AUTOMOUNT(u);
272 assert(a->state == AUTOMOUNT_DEAD);
274 if (a->deserialized_state != a->state) {
276 r = open_dev_autofs(u->manager);
280 if (a->deserialized_state == AUTOMOUNT_WAITING ||
281 a->deserialized_state == AUTOMOUNT_RUNNING) {
283 assert(a->pipe_fd >= 0);
285 r = unit_watch_fd(UNIT(a), a->pipe_fd, EPOLLIN, &a->pipe_watch);
290 automount_set_state(a, a->deserialized_state);
296 static void automount_dump(Unit *u, FILE *f, const char *prefix) {
297 Automount *a = AUTOMOUNT(u);
302 "%sAutomount State: %s\n"
305 "%sDirectoryMode: %04o\n",
306 prefix, automount_state_to_string(a->state),
307 prefix, automount_result_to_string(a->result),
309 prefix, a->directory_mode);
312 static void automount_enter_dead(Automount *a, AutomountResult f) {
315 if (f != AUTOMOUNT_SUCCESS)
318 automount_set_state(a, a->result != AUTOMOUNT_SUCCESS ? AUTOMOUNT_FAILED : AUTOMOUNT_DEAD);
321 static int open_dev_autofs(Manager *m) {
322 struct autofs_dev_ioctl param;
326 if (m->dev_autofs_fd >= 0)
327 return m->dev_autofs_fd;
329 label_fix("/dev/autofs", false, false);
331 m->dev_autofs_fd = open("/dev/autofs", O_CLOEXEC|O_RDONLY);
332 if (m->dev_autofs_fd < 0) {
333 log_error("Failed to open /dev/autofs: %s", strerror(errno));
337 init_autofs_dev_ioctl(¶m);
338 if (ioctl(m->dev_autofs_fd, AUTOFS_DEV_IOCTL_VERSION, ¶m) < 0) {
339 close_nointr_nofail(m->dev_autofs_fd);
340 m->dev_autofs_fd = -1;
344 log_debug("Autofs kernel version %i.%i", param.ver_major, param.ver_minor);
346 return m->dev_autofs_fd;
349 static int open_ioctl_fd(int dev_autofs_fd, const char *where, dev_t devid) {
350 struct autofs_dev_ioctl *param;
353 assert(dev_autofs_fd >= 0);
356 l = sizeof(struct autofs_dev_ioctl) + strlen(where) + 1;
359 init_autofs_dev_ioctl(param);
362 param->openmount.devid = devid;
363 strcpy(param->path, where);
365 if (ioctl(dev_autofs_fd, AUTOFS_DEV_IOCTL_OPENMOUNT, param) < 0)
368 if (param->ioctlfd < 0)
371 fd_cloexec(param->ioctlfd, true);
372 return param->ioctlfd;
375 static int autofs_protocol(int dev_autofs_fd, int ioctl_fd) {
376 uint32_t major, minor;
377 struct autofs_dev_ioctl param;
379 assert(dev_autofs_fd >= 0);
380 assert(ioctl_fd >= 0);
382 init_autofs_dev_ioctl(¶m);
383 param.ioctlfd = ioctl_fd;
385 if (ioctl(dev_autofs_fd, AUTOFS_DEV_IOCTL_PROTOVER, ¶m) < 0)
388 major = param.protover.version;
390 init_autofs_dev_ioctl(¶m);
391 param.ioctlfd = ioctl_fd;
393 if (ioctl(dev_autofs_fd, AUTOFS_DEV_IOCTL_PROTOSUBVER, ¶m) < 0)
396 minor = param.protosubver.sub_version;
398 log_debug("Autofs protocol version %i.%i", major, minor);
402 static int autofs_set_timeout(int dev_autofs_fd, int ioctl_fd, time_t sec) {
403 struct autofs_dev_ioctl param;
405 assert(dev_autofs_fd >= 0);
406 assert(ioctl_fd >= 0);
408 init_autofs_dev_ioctl(¶m);
409 param.ioctlfd = ioctl_fd;
410 param.timeout.timeout = sec;
412 if (ioctl(dev_autofs_fd, AUTOFS_DEV_IOCTL_TIMEOUT, ¶m) < 0)
418 static int autofs_send_ready(int dev_autofs_fd, int ioctl_fd, uint32_t token, int status) {
419 struct autofs_dev_ioctl param;
421 assert(dev_autofs_fd >= 0);
422 assert(ioctl_fd >= 0);
424 init_autofs_dev_ioctl(¶m);
425 param.ioctlfd = ioctl_fd;
428 param.fail.token = token;
429 param.fail.status = status;
431 param.ready.token = token;
433 if (ioctl(dev_autofs_fd, status ? AUTOFS_DEV_IOCTL_FAIL : AUTOFS_DEV_IOCTL_READY, ¶m) < 0)
439 int automount_send_ready(Automount *a, int status) {
446 if (set_isempty(a->tokens))
449 ioctl_fd = open_ioctl_fd(UNIT(a)->manager->dev_autofs_fd, a->where, a->dev_id);
456 log_debug("Sending failure: %s", strerror(-status));
458 log_debug("Sending success.");
462 /* Autofs thankfully does not hand out 0 as a token */
463 while ((token = PTR_TO_UINT(set_steal_first(a->tokens)))) {
466 /* Autofs fun fact II:
468 * if you pass a positive status code here, the kernel will
471 k = autofs_send_ready(UNIT(a)->manager->dev_autofs_fd,
481 close_nointr_nofail(ioctl_fd);
486 static void automount_enter_waiting(Automount *a) {
487 int p[2] = { -1, -1 };
488 char name[32], options[128];
489 bool mounted = false;
490 int r, ioctl_fd = -1, dev_autofs_fd;
494 assert(a->pipe_fd < 0);
498 set_clear(a->tokens);
500 dev_autofs_fd = open_dev_autofs(UNIT(a)->manager);
501 if (dev_autofs_fd < 0) {
506 /* We knowingly ignore the results of this call */
507 mkdir_p_label(a->where, 0555);
509 if (dir_is_empty(a->where) <= 0)
510 log_notice("%s: Directory %s to mount over is not empty, mounting anyway. (To see the over-mounted files, please manually mount the underlying file system to a secondary location.)", a->meta.id, a->where);
512 if (pipe2(p, O_NONBLOCK|O_CLOEXEC) < 0) {
517 snprintf(options, sizeof(options), "fd=%i,pgrp=%u,minproto=5,maxproto=5,direct", p[1], (unsigned) getpgrp());
518 char_array_0(options);
520 snprintf(name, sizeof(name), "systemd-%u", (unsigned) getpid());
523 if (mount(name, a->where, "autofs", 0, options) < 0) {
530 close_nointr_nofail(p[1]);
533 if (stat(a->where, &st) < 0) {
538 ioctl_fd = open_ioctl_fd(dev_autofs_fd, a->where, st.st_dev);
544 r = autofs_protocol(dev_autofs_fd, ioctl_fd);
548 r = autofs_set_timeout(dev_autofs_fd, ioctl_fd, 300);
554 * Unless we close the ioctl fd here, for some weird reason
555 * the direct mount will not receive events from the
558 close_nointr_nofail(ioctl_fd);
561 r = unit_watch_fd(UNIT(a), p[0], EPOLLIN, &a->pipe_watch);
566 a->dev_id = st.st_dev;
568 automount_set_state(a, AUTOMOUNT_WAITING);
573 assert_se(close_pipe(p) == 0);
576 close_nointr_nofail(ioctl_fd);
579 repeat_unmout(a->where);
581 log_error("Failed to initialize automounter: %s", strerror(-r));
582 automount_enter_dead(a, AUTOMOUNT_FAILURE_RESOURCES);
585 static void automount_enter_runnning(Automount *a) {
591 assert(UNIT_DEREF(a->mount));
593 dbus_error_init(&error);
595 /* We don't take mount requests anymore if we are supposed to
596 * shut down anyway */
597 if (unit_pending_inactive(UNIT(a))) {
598 log_debug("Suppressing automount request on %s since unit stop is scheduled.", UNIT(a)->id);
599 automount_send_ready(a, -EHOSTDOWN);
603 mkdir_p_label(a->where, a->directory_mode);
605 /* Before we do anything, let's see if somebody is playing games with us? */
606 if (lstat(a->where, &st) < 0) {
607 log_warning("%s failed to stat automount point: %m", UNIT(a)->id);
611 if (!S_ISDIR(st.st_mode) || st.st_dev != a->dev_id)
612 log_info("%s's automount point already active?", UNIT(a)->id);
613 else if ((r = manager_add_job(UNIT(a)->manager, JOB_START, UNIT_DEREF(a->mount), JOB_REPLACE, true, &error, NULL)) < 0) {
614 log_warning("%s failed to queue mount startup job: %s", UNIT(a)->id, bus_error(&error, r));
618 automount_set_state(a, AUTOMOUNT_RUNNING);
622 automount_enter_dead(a, AUTOMOUNT_FAILURE_RESOURCES);
623 dbus_error_free(&error);
626 static int automount_start(Unit *u) {
627 Automount *a = AUTOMOUNT(u);
630 assert(a->state == AUTOMOUNT_DEAD || a->state == AUTOMOUNT_FAILED);
632 if (path_is_mount_point(a->where, false)) {
633 log_error("Path %s is already a mount point, refusing start for %s", a->where, u->id);
637 if (UNIT_DEREF(a->mount)->load_state != UNIT_LOADED)
640 a->result = AUTOMOUNT_SUCCESS;
641 automount_enter_waiting(a);
645 static int automount_stop(Unit *u) {
646 Automount *a = AUTOMOUNT(u);
649 assert(a->state == AUTOMOUNT_WAITING || a->state == AUTOMOUNT_RUNNING);
651 automount_enter_dead(a, AUTOMOUNT_SUCCESS);
655 static int automount_serialize(Unit *u, FILE *f, FDSet *fds) {
656 Automount *a = AUTOMOUNT(u);
664 unit_serialize_item(u, f, "state", automount_state_to_string(a->state));
665 unit_serialize_item(u, f, "result", automount_result_to_string(a->result));
666 unit_serialize_item_format(u, f, "dev-id", "%u", (unsigned) a->dev_id);
668 SET_FOREACH(p, a->tokens, i)
669 unit_serialize_item_format(u, f, "token", "%u", PTR_TO_UINT(p));
671 if (a->pipe_fd >= 0) {
674 copy = fdset_put_dup(fds, a->pipe_fd);
678 unit_serialize_item_format(u, f, "pipe-fd", "%i", copy);
684 static int automount_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
685 Automount *a = AUTOMOUNT(u);
691 if (streq(key, "state")) {
692 AutomountState state;
694 state = automount_state_from_string(value);
696 log_debug("Failed to parse state value %s", value);
698 a->deserialized_state = state;
699 } else if (streq(key, "result")) {
702 f = automount_result_from_string(value);
704 log_debug("Failed to parse result value %s", value);
705 else if (f != AUTOMOUNT_SUCCESS)
708 } else if (streq(key, "dev-id")) {
711 if (safe_atou(value, &d) < 0)
712 log_debug("Failed to parse dev-id value %s", value);
714 a->dev_id = (unsigned) d;
715 } else if (streq(key, "token")) {
718 if (safe_atou(value, &token) < 0)
719 log_debug("Failed to parse token value %s", value);
722 if (!(a->tokens = set_new(trivial_hash_func, trivial_compare_func)))
725 r = set_put(a->tokens, UINT_TO_PTR(token));
729 } else if (streq(key, "pipe-fd")) {
732 if (safe_atoi(value, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
733 log_debug("Failed to parse pipe-fd value %s", value);
736 close_nointr_nofail(a->pipe_fd);
738 a->pipe_fd = fdset_remove(fds, fd);
741 log_debug("Unknown serialization key '%s'", key);
746 static UnitActiveState automount_active_state(Unit *u) {
749 return state_translation_table[AUTOMOUNT(u)->state];
752 static const char *automount_sub_state_to_string(Unit *u) {
755 return automount_state_to_string(AUTOMOUNT(u)->state);
758 static bool automount_check_gc(Unit *u) {
759 Automount *a = AUTOMOUNT(u);
763 if (!UNIT_DEREF(a->mount))
766 return UNIT_VTABLE(UNIT_DEREF(a->mount))->check_gc(UNIT_DEREF(a->mount));
769 static void automount_fd_event(Unit *u, int fd, uint32_t events, Watch *w) {
770 Automount *a = AUTOMOUNT(u);
771 union autofs_v5_packet_union packet;
776 assert(fd == a->pipe_fd);
778 if (events != EPOLLIN) {
779 log_error("Got invalid poll event on pipe.");
783 l = loop_read(a->pipe_fd, &packet, sizeof(packet), true);
784 if (l != sizeof(packet)) {
785 log_error("Invalid read from pipe: %s", l < 0 ? strerror(-l) : "short read");
789 switch (packet.hdr.type) {
791 case autofs_ptype_missing_direct:
793 if (packet.v5_packet.pid > 0) {
796 get_process_comm(packet.v5_packet.pid, &p);
797 log_debug("Got direct mount request on %s, triggered by %lu (%s)",
798 a->where, (unsigned long) packet.v5_packet.pid, strna(p));
802 log_debug("Got direct mount request on %s", a->where);
804 r = set_ensure_allocated(&a->tokens, trivial_hash_func, trivial_compare_func);
806 log_error("Failed to allocate token set.");
810 r = set_put(a->tokens, UINT_TO_PTR(packet.v5_packet.wait_queue_token));
812 log_error("Failed to remember token: %s", strerror(-r));
816 automount_enter_runnning(a);
820 log_error("Received unknown automount request %i", packet.hdr.type);
827 automount_enter_dead(a, AUTOMOUNT_FAILURE_RESOURCES);
830 static void automount_shutdown(Manager *m) {
833 if (m->dev_autofs_fd >= 0)
834 close_nointr_nofail(m->dev_autofs_fd);
837 static void automount_reset_failed(Unit *u) {
838 Automount *a = AUTOMOUNT(u);
842 if (a->state == AUTOMOUNT_FAILED)
843 automount_set_state(a, AUTOMOUNT_DEAD);
845 a->result = AUTOMOUNT_SUCCESS;
848 static const char* const automount_state_table[_AUTOMOUNT_STATE_MAX] = {
849 [AUTOMOUNT_DEAD] = "dead",
850 [AUTOMOUNT_WAITING] = "waiting",
851 [AUTOMOUNT_RUNNING] = "running",
852 [AUTOMOUNT_FAILED] = "failed"
855 DEFINE_STRING_TABLE_LOOKUP(automount_state, AutomountState);
857 static const char* const automount_result_table[_AUTOMOUNT_RESULT_MAX] = {
858 [AUTOMOUNT_SUCCESS] = "success",
859 [AUTOMOUNT_FAILURE_RESOURCES] = "resources"
862 DEFINE_STRING_TABLE_LOOKUP(automount_result, AutomountResult);
864 const UnitVTable automount_vtable = {
865 .object_size = sizeof(Automount),
872 .no_instances = true,
874 .init = automount_init,
875 .load = automount_load,
876 .done = automount_done,
878 .coldplug = automount_coldplug,
880 .dump = automount_dump,
882 .start = automount_start,
883 .stop = automount_stop,
885 .serialize = automount_serialize,
886 .deserialize_item = automount_deserialize_item,
888 .active_state = automount_active_state,
889 .sub_state_to_string = automount_sub_state_to_string,
891 .check_gc = automount_check_gc,
893 .fd_event = automount_fd_event,
895 .reset_failed = automount_reset_failed,
897 .bus_interface = "org.freedesktop.systemd1.Automount",
898 .bus_message_handler = bus_automount_message_handler,
899 .bus_invalidating_properties = bus_automount_invalidating_properties,
901 .shutdown = automount_shutdown,
903 .status_message_formats = {
904 .finished_start_job = {
905 [JOB_DONE] = "Set up automount %s.",
906 [JOB_FAILED] = "Failed to set up automount %s.",
907 [JOB_DEPENDENCY] = "Dependency failed for %s.",
909 .finished_stop_job = {
910 [JOB_DONE] = "Unset automount %s.",
911 [JOB_FAILED] = "Failed to unset automount %s.",