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/>.
25 #include <linux/auto_dev-ioctl.h>
26 #include <linux/auto_fs4.h>
27 #include <sys/epoll.h>
28 #include <sys/mount.h>
32 #include "alloc-util.h"
34 #include "automount.h"
35 #include "bus-error.h"
37 #include "dbus-automount.h"
39 #include "formats-util.h"
43 #include "mount-util.h"
45 #include "parse-util.h"
46 #include "path-util.h"
47 #include "process-util.h"
49 #include "stdio-util.h"
50 #include "string-table.h"
51 #include "string-util.h"
52 #include "unit-name.h"
55 static const UnitActiveState state_translation_table
[_AUTOMOUNT_STATE_MAX
] = {
56 [AUTOMOUNT_DEAD
] = UNIT_INACTIVE
,
57 [AUTOMOUNT_WAITING
] = UNIT_ACTIVE
,
58 [AUTOMOUNT_RUNNING
] = UNIT_ACTIVE
,
59 [AUTOMOUNT_FAILED
] = UNIT_FAILED
67 static inline void expire_data_free(struct expire_data
*data
) {
71 safe_close(data
->dev_autofs_fd
);
72 safe_close(data
->ioctl_fd
);
76 DEFINE_TRIVIAL_CLEANUP_FUNC(struct expire_data
*, expire_data_free
);
78 static int open_dev_autofs(Manager
*m
);
79 static int automount_dispatch_io(sd_event_source
*s
, int fd
, uint32_t events
, void *userdata
);
81 static void automount_init(Unit
*u
) {
82 Automount
*a
= AUTOMOUNT(u
);
85 assert(u
->load_state
== UNIT_STUB
);
88 a
->directory_mode
= 0755;
89 UNIT(a
)->ignore_on_isolate
= true;
92 static void repeat_unmount(const char *path
) {
96 /* If there are multiple mounts on a mount point, this
99 if (umount2(path
, MNT_DETACH
) >= 0)
103 log_error_errno(errno
, "Failed to unmount: %m");
109 static int automount_send_ready(Automount
*a
, Set
*tokens
, int status
);
111 static void unmount_autofs(Automount
*a
) {
117 automount_send_ready(a
, a
->tokens
, -EHOSTDOWN
);
118 automount_send_ready(a
, a
->expire_tokens
, -EHOSTDOWN
);
120 a
->pipe_event_source
= sd_event_source_unref(a
->pipe_event_source
);
121 a
->pipe_fd
= safe_close(a
->pipe_fd
);
123 /* If we reload/reexecute things we keep the mount point
126 (UNIT(a
)->manager
->exit_code
!= MANAGER_RELOAD
&&
127 UNIT(a
)->manager
->exit_code
!= MANAGER_REEXECUTE
))
128 repeat_unmount(a
->where
);
131 static void automount_done(Unit
*u
) {
132 Automount
*a
= AUTOMOUNT(u
);
138 a
->where
= mfree(a
->where
);
140 a
->tokens
= set_free(a
->tokens
);
141 a
->expire_tokens
= set_free(a
->expire_tokens
);
143 a
->expire_event_source
= sd_event_source_unref(a
->expire_event_source
);
146 static int automount_add_mount_links(Automount
*a
) {
147 _cleanup_free_
char *parent
= NULL
;
151 parent
= dirname_malloc(a
->where
);
155 return unit_require_mounts_for(UNIT(a
), parent
);
158 static int automount_add_default_dependencies(Automount
*a
) {
163 if (UNIT(a
)->manager
->running_as
!= MANAGER_SYSTEM
)
166 r
= unit_add_two_dependencies_by_name(UNIT(a
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
173 static int automount_verify(Automount
*a
) {
174 _cleanup_free_
char *e
= NULL
;
179 if (UNIT(a
)->load_state
!= UNIT_LOADED
)
182 if (path_equal(a
->where
, "/")) {
183 log_unit_error(UNIT(a
), "Cannot have an automount unit for the root directory. Refusing.");
187 r
= unit_name_from_path(a
->where
, ".automount", &e
);
189 return log_unit_error(UNIT(a
), "Failed to generate unit name from path: %m");
191 if (!unit_has_name(UNIT(a
), e
)) {
192 log_unit_error(UNIT(a
), "Where= setting doesn't match unit name. Refusing.");
199 static int automount_load(Unit
*u
) {
200 Automount
*a
= AUTOMOUNT(u
);
204 assert(u
->load_state
== UNIT_STUB
);
206 /* Load a .automount file */
207 r
= unit_load_fragment_and_dropin_optional(u
);
211 if (u
->load_state
== UNIT_LOADED
) {
215 r
= unit_name_to_path(u
->id
, &a
->where
);
220 path_kill_slashes(a
->where
);
222 r
= unit_load_related_unit(u
, ".mount", &x
);
226 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, x
, true);
230 r
= automount_add_mount_links(a
);
234 if (UNIT(a
)->default_dependencies
) {
235 r
= automount_add_default_dependencies(a
);
241 return automount_verify(a
);
244 static void automount_set_state(Automount
*a
, AutomountState state
) {
245 AutomountState old_state
;
248 old_state
= a
->state
;
251 if (state
!= AUTOMOUNT_WAITING
&&
252 state
!= AUTOMOUNT_RUNNING
)
255 if (state
!= old_state
)
256 log_unit_debug(UNIT(a
), "Changed %s -> %s", automount_state_to_string(old_state
), automount_state_to_string(state
));
258 unit_notify(UNIT(a
), state_translation_table
[old_state
], state_translation_table
[state
], true);
261 static int automount_coldplug(Unit
*u
) {
262 Automount
*a
= AUTOMOUNT(u
);
266 assert(a
->state
== AUTOMOUNT_DEAD
);
268 if (a
->deserialized_state
!= a
->state
) {
270 r
= open_dev_autofs(u
->manager
);
274 if (a
->deserialized_state
== AUTOMOUNT_WAITING
||
275 a
->deserialized_state
== AUTOMOUNT_RUNNING
) {
276 assert(a
->pipe_fd
>= 0);
278 r
= sd_event_add_io(u
->manager
->event
, &a
->pipe_event_source
, a
->pipe_fd
, EPOLLIN
, automount_dispatch_io
, u
);
282 (void) sd_event_source_set_description(a
->pipe_event_source
, "automount-io");
285 automount_set_state(a
, a
->deserialized_state
);
291 static void automount_dump(Unit
*u
, FILE *f
, const char *prefix
) {
292 char time_string
[FORMAT_TIMESPAN_MAX
];
293 Automount
*a
= AUTOMOUNT(u
);
298 "%sAutomount State: %s\n"
301 "%sDirectoryMode: %04o\n"
302 "%sTimeoutIdleUSec: %s\n",
303 prefix
, automount_state_to_string(a
->state
),
304 prefix
, automount_result_to_string(a
->result
),
306 prefix
, a
->directory_mode
,
307 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, a
->timeout_idle_usec
, USEC_PER_SEC
));
310 static void automount_enter_dead(Automount
*a
, AutomountResult f
) {
313 if (f
!= AUTOMOUNT_SUCCESS
)
316 automount_set_state(a
, a
->result
!= AUTOMOUNT_SUCCESS
? AUTOMOUNT_FAILED
: AUTOMOUNT_DEAD
);
319 static int open_dev_autofs(Manager
*m
) {
320 struct autofs_dev_ioctl param
;
324 if (m
->dev_autofs_fd
>= 0)
325 return m
->dev_autofs_fd
;
327 label_fix("/dev/autofs", false, false);
329 m
->dev_autofs_fd
= open("/dev/autofs", O_CLOEXEC
|O_RDONLY
);
330 if (m
->dev_autofs_fd
< 0)
331 return log_error_errno(errno
, "Failed to open /dev/autofs: %m");
333 init_autofs_dev_ioctl(¶m
);
334 if (ioctl(m
->dev_autofs_fd
, AUTOFS_DEV_IOCTL_VERSION
, ¶m
) < 0) {
335 m
->dev_autofs_fd
= safe_close(m
->dev_autofs_fd
);
339 log_debug("Autofs kernel version %i.%i", param
.ver_major
, param
.ver_minor
);
341 return m
->dev_autofs_fd
;
344 static int open_ioctl_fd(int dev_autofs_fd
, const char *where
, dev_t devid
) {
345 struct autofs_dev_ioctl
*param
;
348 assert(dev_autofs_fd
>= 0);
351 l
= sizeof(struct autofs_dev_ioctl
) + strlen(where
) + 1;
354 init_autofs_dev_ioctl(param
);
357 param
->openmount
.devid
= devid
;
358 strcpy(param
->path
, where
);
360 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_OPENMOUNT
, param
) < 0)
363 if (param
->ioctlfd
< 0)
366 (void) fd_cloexec(param
->ioctlfd
, true);
367 return param
->ioctlfd
;
370 static int autofs_protocol(int dev_autofs_fd
, int ioctl_fd
) {
371 uint32_t major
, minor
;
372 struct autofs_dev_ioctl param
;
374 assert(dev_autofs_fd
>= 0);
375 assert(ioctl_fd
>= 0);
377 init_autofs_dev_ioctl(¶m
);
378 param
.ioctlfd
= ioctl_fd
;
380 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_PROTOVER
, ¶m
) < 0)
383 major
= param
.protover
.version
;
385 init_autofs_dev_ioctl(¶m
);
386 param
.ioctlfd
= ioctl_fd
;
388 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_PROTOSUBVER
, ¶m
) < 0)
391 minor
= param
.protosubver
.sub_version
;
393 log_debug("Autofs protocol version %i.%i", major
, minor
);
397 static int autofs_set_timeout(int dev_autofs_fd
, int ioctl_fd
, usec_t usec
) {
398 struct autofs_dev_ioctl param
;
400 assert(dev_autofs_fd
>= 0);
401 assert(ioctl_fd
>= 0);
403 init_autofs_dev_ioctl(¶m
);
404 param
.ioctlfd
= ioctl_fd
;
406 /* Convert to seconds, rounding up. */
407 param
.timeout
.timeout
= (usec
+ USEC_PER_SEC
- 1) / USEC_PER_SEC
;
409 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_TIMEOUT
, ¶m
) < 0)
415 static int autofs_send_ready(int dev_autofs_fd
, int ioctl_fd
, uint32_t token
, int status
) {
416 struct autofs_dev_ioctl param
;
418 assert(dev_autofs_fd
>= 0);
419 assert(ioctl_fd
>= 0);
421 init_autofs_dev_ioctl(¶m
);
422 param
.ioctlfd
= ioctl_fd
;
425 param
.fail
.token
= token
;
426 param
.fail
.status
= status
;
428 param
.ready
.token
= token
;
430 if (ioctl(dev_autofs_fd
, status
? AUTOFS_DEV_IOCTL_FAIL
: AUTOFS_DEV_IOCTL_READY
, ¶m
) < 0)
436 static int automount_send_ready(Automount
*a
, Set
*tokens
, int status
) {
437 _cleanup_close_
int ioctl_fd
= -1;
444 if (set_isempty(tokens
))
447 ioctl_fd
= open_ioctl_fd(UNIT(a
)->manager
->dev_autofs_fd
, a
->where
, a
->dev_id
);
452 log_unit_debug_errno(UNIT(a
), status
, "Sending failure: %m");
454 log_unit_debug(UNIT(a
), "Sending success.");
458 /* Autofs thankfully does not hand out 0 as a token */
459 while ((token
= PTR_TO_UINT(set_steal_first(tokens
)))) {
462 /* Autofs fun fact II:
464 * if you pass a positive status code here, the kernel will
467 k
= autofs_send_ready(UNIT(a
)->manager
->dev_autofs_fd
,
478 static int automount_start_expire(Automount
*a
);
480 int automount_update_mount(Automount
*a
, MountState old_state
, MountState state
) {
487 case MOUNT_REMOUNTING
:
488 automount_send_ready(a
, a
->tokens
, 0);
489 r
= automount_start_expire(a
);
491 log_unit_warning_errno(UNIT(a
), r
, "Failed to start expiration timer, ignoring: %m");
494 case MOUNT_UNMOUNTING
:
495 case MOUNT_MOUNTING_SIGTERM
:
496 case MOUNT_MOUNTING_SIGKILL
:
497 case MOUNT_REMOUNTING_SIGTERM
:
498 case MOUNT_REMOUNTING_SIGKILL
:
499 case MOUNT_UNMOUNTING_SIGTERM
:
500 case MOUNT_UNMOUNTING_SIGKILL
:
502 if (old_state
!= state
)
503 automount_send_ready(a
, a
->tokens
, -ENODEV
);
504 (void) sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_OFF
);
512 automount_send_ready(a
, a
->expire_tokens
, 0);
515 case MOUNT_MOUNTING_DONE
:
516 case MOUNT_MOUNTING_SIGTERM
:
517 case MOUNT_MOUNTING_SIGKILL
:
518 case MOUNT_REMOUNTING_SIGTERM
:
519 case MOUNT_REMOUNTING_SIGKILL
:
520 case MOUNT_UNMOUNTING_SIGTERM
:
521 case MOUNT_UNMOUNTING_SIGKILL
:
523 if (old_state
!= state
)
524 automount_send_ready(a
, a
->expire_tokens
, -ENODEV
);
533 static void automount_enter_waiting(Automount
*a
) {
534 _cleanup_close_
int ioctl_fd
= -1;
535 int p
[2] = { -1, -1 };
536 char name
[sizeof("systemd-")-1 + DECIMAL_STR_MAX(pid_t
) + 1];
537 char options
[sizeof("fd=,pgrp=,minproto=5,maxproto=5,direct")-1
538 + DECIMAL_STR_MAX(int) + DECIMAL_STR_MAX(gid_t
) + 1];
539 bool mounted
= false;
540 int r
, dev_autofs_fd
;
544 assert(a
->pipe_fd
< 0);
547 set_clear(a
->tokens
);
549 r
= unit_fail_if_symlink(UNIT(a
), a
->where
);
553 (void) mkdir_p_label(a
->where
, 0555);
555 unit_warn_if_dir_nonempty(UNIT(a
), a
->where
);
557 dev_autofs_fd
= open_dev_autofs(UNIT(a
)->manager
);
558 if (dev_autofs_fd
< 0) {
563 if (pipe2(p
, O_NONBLOCK
|O_CLOEXEC
) < 0) {
568 xsprintf(options
, "fd=%i,pgrp="PID_FMT
",minproto=5,maxproto=5,direct", p
[1], getpgrp());
569 xsprintf(name
, "systemd-"PID_FMT
, getpid());
570 if (mount(name
, a
->where
, "autofs", 0, options
) < 0) {
577 p
[1] = safe_close(p
[1]);
579 if (stat(a
->where
, &st
) < 0) {
584 ioctl_fd
= open_ioctl_fd(dev_autofs_fd
, a
->where
, st
.st_dev
);
590 r
= autofs_protocol(dev_autofs_fd
, ioctl_fd
);
594 r
= autofs_set_timeout(dev_autofs_fd
, ioctl_fd
, a
->timeout_idle_usec
);
600 * Unless we close the ioctl fd here, for some weird reason
601 * the direct mount will not receive events from the
604 r
= sd_event_add_io(UNIT(a
)->manager
->event
, &a
->pipe_event_source
, p
[0], EPOLLIN
, automount_dispatch_io
, a
);
608 (void) sd_event_source_set_description(a
->pipe_event_source
, "automount-io");
611 a
->dev_id
= st
.st_dev
;
613 automount_set_state(a
, AUTOMOUNT_WAITING
);
621 repeat_unmount(a
->where
);
623 log_unit_error_errno(UNIT(a
), r
, "Failed to initialize automounter: %m");
624 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
627 static void *expire_thread(void *p
) {
628 struct autofs_dev_ioctl param
;
629 _cleanup_(expire_data_freep
) struct expire_data
*data
= (struct expire_data
*)p
;
632 assert(data
->dev_autofs_fd
>= 0);
633 assert(data
->ioctl_fd
>= 0);
635 init_autofs_dev_ioctl(¶m
);
636 param
.ioctlfd
= data
->ioctl_fd
;
639 r
= ioctl(data
->dev_autofs_fd
, AUTOFS_DEV_IOCTL_EXPIRE
, ¶m
);
643 log_warning_errno(errno
, "Failed to expire automount, ignoring: %m");
648 static int automount_dispatch_expire(sd_event_source
*source
, usec_t usec
, void *userdata
) {
649 Automount
*a
= AUTOMOUNT(userdata
);
650 _cleanup_(expire_data_freep
) struct expire_data
*data
= NULL
;
654 assert(source
== a
->expire_event_source
);
656 data
= new0(struct expire_data
, 1);
662 data
->dev_autofs_fd
= fcntl(UNIT(a
)->manager
->dev_autofs_fd
, F_DUPFD_CLOEXEC
, 3);
663 if (data
->dev_autofs_fd
< 0)
664 return log_unit_error_errno(UNIT(a
), errno
, "Failed to duplicate autofs fd: %m");
666 data
->ioctl_fd
= open_ioctl_fd(UNIT(a
)->manager
->dev_autofs_fd
, a
->where
, a
->dev_id
);
667 if (data
->ioctl_fd
< 0)
668 return log_unit_error_errno(UNIT(a
), data
->ioctl_fd
, "Couldn't open autofs ioctl fd: %m");
670 r
= asynchronous_job(expire_thread
, data
);
672 return log_unit_error_errno(UNIT(a
), r
, "Failed to start expire job: %m");
676 return automount_start_expire(a
);
679 static int automount_start_expire(Automount
*a
) {
685 if (a
->timeout_idle_usec
== 0)
688 timeout
= now(CLOCK_MONOTONIC
) + MAX(a
->timeout_idle_usec
/3, USEC_PER_SEC
);
690 if (a
->expire_event_source
) {
691 r
= sd_event_source_set_time(a
->expire_event_source
, timeout
);
695 return sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_ONESHOT
);
698 r
= sd_event_add_time(
699 UNIT(a
)->manager
->event
,
700 &a
->expire_event_source
,
701 CLOCK_MONOTONIC
, timeout
, 0,
702 automount_dispatch_expire
, a
);
706 (void) sd_event_source_set_description(a
->expire_event_source
, "automount-expire");
711 static void automount_enter_runnning(Automount
*a
) {
712 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
718 /* We don't take mount requests anymore if we are supposed to
719 * shut down anyway */
720 if (unit_stop_pending(UNIT(a
))) {
721 log_unit_debug(UNIT(a
), "Suppressing automount request since unit stop is scheduled.");
722 automount_send_ready(a
, a
->tokens
, -EHOSTDOWN
);
723 automount_send_ready(a
, a
->expire_tokens
, -EHOSTDOWN
);
727 mkdir_p_label(a
->where
, a
->directory_mode
);
729 /* Before we do anything, let's see if somebody is playing games with us? */
730 if (lstat(a
->where
, &st
) < 0) {
731 log_unit_warning_errno(UNIT(a
), errno
, "Failed to stat automount point: %m");
735 if (!S_ISDIR(st
.st_mode
) || st
.st_dev
!= a
->dev_id
)
736 log_unit_info(UNIT(a
), "Automount point already active?");
738 r
= manager_add_job(UNIT(a
)->manager
, JOB_START
, UNIT_TRIGGER(UNIT(a
)),
739 JOB_REPLACE
, true, &error
, NULL
);
741 log_unit_warning(UNIT(a
), "Failed to queue mount startup job: %s", bus_error_message(&error
, r
));
746 automount_set_state(a
, AUTOMOUNT_RUNNING
);
750 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
753 static int automount_start(Unit
*u
) {
754 Automount
*a
= AUTOMOUNT(u
);
757 assert(a
->state
== AUTOMOUNT_DEAD
|| a
->state
== AUTOMOUNT_FAILED
);
759 if (path_is_mount_point(a
->where
, 0) > 0) {
760 log_unit_error(u
, "Path %s is already a mount point, refusing start.", a
->where
);
764 if (UNIT_TRIGGER(u
)->load_state
!= UNIT_LOADED
)
767 a
->result
= AUTOMOUNT_SUCCESS
;
768 automount_enter_waiting(a
);
772 static int automount_stop(Unit
*u
) {
773 Automount
*a
= AUTOMOUNT(u
);
776 assert(a
->state
== AUTOMOUNT_WAITING
|| a
->state
== AUTOMOUNT_RUNNING
);
778 automount_enter_dead(a
, AUTOMOUNT_SUCCESS
);
782 static int automount_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
783 Automount
*a
= AUTOMOUNT(u
);
792 unit_serialize_item(u
, f
, "state", automount_state_to_string(a
->state
));
793 unit_serialize_item(u
, f
, "result", automount_result_to_string(a
->result
));
794 unit_serialize_item_format(u
, f
, "dev-id", "%u", (unsigned) a
->dev_id
);
796 SET_FOREACH(p
, a
->tokens
, i
)
797 unit_serialize_item_format(u
, f
, "token", "%u", PTR_TO_UINT(p
));
798 SET_FOREACH(p
, a
->expire_tokens
, i
)
799 unit_serialize_item_format(u
, f
, "expire-token", "%u", PTR_TO_UINT(p
));
801 r
= unit_serialize_item_fd(u
, f
, fds
, "pipe-fd", a
->pipe_fd
);
808 static int automount_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
809 Automount
*a
= AUTOMOUNT(u
);
815 if (streq(key
, "state")) {
816 AutomountState state
;
818 state
= automount_state_from_string(value
);
820 log_unit_debug(u
, "Failed to parse state value: %s", value
);
822 a
->deserialized_state
= state
;
823 } else if (streq(key
, "result")) {
826 f
= automount_result_from_string(value
);
828 log_unit_debug(u
, "Failed to parse result value: %s", value
);
829 else if (f
!= AUTOMOUNT_SUCCESS
)
832 } else if (streq(key
, "dev-id")) {
835 if (safe_atou(value
, &d
) < 0)
836 log_unit_debug(u
, "Failed to parse dev-id value: %s", value
);
838 a
->dev_id
= (unsigned) d
;
839 } else if (streq(key
, "token")) {
842 if (safe_atou(value
, &token
) < 0)
843 log_unit_debug(u
, "Failed to parse token value: %s", value
);
845 r
= set_ensure_allocated(&a
->tokens
, NULL
);
851 r
= set_put(a
->tokens
, UINT_TO_PTR(token
));
853 log_unit_error_errno(u
, r
, "Failed to add token to set: %m");
855 } else if (streq(key
, "expire-token")) {
858 if (safe_atou(value
, &token
) < 0)
859 log_unit_debug(u
, "Failed to parse token value: %s", value
);
861 r
= set_ensure_allocated(&a
->expire_tokens
, NULL
);
867 r
= set_put(a
->expire_tokens
, UINT_TO_PTR(token
));
869 log_unit_error_errno(u
, r
, "Failed to add expire token to set: %m");
871 } else if (streq(key
, "pipe-fd")) {
874 if (safe_atoi(value
, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
875 log_unit_debug(u
, "Failed to parse pipe-fd value: %s", value
);
877 safe_close(a
->pipe_fd
);
878 a
->pipe_fd
= fdset_remove(fds
, fd
);
881 log_unit_debug(u
, "Unknown serialization key: %s", key
);
886 static UnitActiveState
automount_active_state(Unit
*u
) {
889 return state_translation_table
[AUTOMOUNT(u
)->state
];
892 static const char *automount_sub_state_to_string(Unit
*u
) {
895 return automount_state_to_string(AUTOMOUNT(u
)->state
);
898 static bool automount_check_gc(Unit
*u
) {
901 if (!UNIT_TRIGGER(u
))
904 return UNIT_VTABLE(UNIT_TRIGGER(u
))->check_gc(UNIT_TRIGGER(u
));
907 static int automount_dispatch_io(sd_event_source
*s
, int fd
, uint32_t events
, void *userdata
) {
908 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
909 union autofs_v5_packet_union packet
;
910 Automount
*a
= AUTOMOUNT(userdata
);
915 assert(fd
== a
->pipe_fd
);
917 if (events
!= EPOLLIN
) {
918 log_unit_error(UNIT(a
), "Got invalid poll event %"PRIu32
" on pipe (fd=%d)", events
, fd
);
922 r
= loop_read_exact(a
->pipe_fd
, &packet
, sizeof(packet
), true);
924 log_unit_error_errno(UNIT(a
), r
, "Invalid read from pipe: %m");
928 switch (packet
.hdr
.type
) {
930 case autofs_ptype_missing_direct
:
932 if (packet
.v5_packet
.pid
> 0) {
933 _cleanup_free_
char *p
= NULL
;
935 get_process_comm(packet
.v5_packet
.pid
, &p
);
936 log_unit_info(UNIT(a
), "Got automount request for %s, triggered by %"PRIu32
" (%s)", a
->where
, packet
.v5_packet
.pid
, strna(p
));
938 log_unit_debug(UNIT(a
), "Got direct mount request on %s", a
->where
);
940 r
= set_ensure_allocated(&a
->tokens
, NULL
);
942 log_unit_error(UNIT(a
), "Failed to allocate token set.");
946 r
= set_put(a
->tokens
, UINT_TO_PTR(packet
.v5_packet
.wait_queue_token
));
948 log_unit_error_errno(UNIT(a
), r
, "Failed to remember token: %m");
952 automount_enter_runnning(a
);
955 case autofs_ptype_expire_direct
:
956 log_unit_debug(UNIT(a
), "Got direct umount request on %s", a
->where
);
958 (void) sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_OFF
);
960 r
= set_ensure_allocated(&a
->expire_tokens
, NULL
);
962 log_unit_error(UNIT(a
), "Failed to allocate token set.");
966 r
= set_put(a
->expire_tokens
, UINT_TO_PTR(packet
.v5_packet
.wait_queue_token
));
968 log_unit_error_errno(UNIT(a
), r
, "Failed to remember token: %m");
972 /* Before we do anything, let's see if somebody is playing games with us? */
973 if (lstat(a
->where
, &st
) < 0) {
974 log_unit_warning_errno(UNIT(a
), errno
, "Failed to stat automount point: %m");
978 if (!S_ISDIR(st
.st_mode
) || st
.st_dev
== a
->dev_id
) {
979 log_unit_info(UNIT(a
), "Automount point already unmounted?");
980 automount_send_ready(a
, a
->expire_tokens
, 0);
984 r
= manager_add_job(UNIT(a
)->manager
, JOB_STOP
, UNIT_TRIGGER(UNIT(a
)), JOB_REPLACE
, true, &error
, NULL
);
986 log_unit_warning(UNIT(a
), "Failed to queue umount startup job: %s", bus_error_message(&error
, r
));
992 log_unit_error(UNIT(a
), "Received unknown automount request %i", packet
.hdr
.type
);
999 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
1003 static void automount_shutdown(Manager
*m
) {
1006 m
->dev_autofs_fd
= safe_close(m
->dev_autofs_fd
);
1009 static void automount_reset_failed(Unit
*u
) {
1010 Automount
*a
= AUTOMOUNT(u
);
1014 if (a
->state
== AUTOMOUNT_FAILED
)
1015 automount_set_state(a
, AUTOMOUNT_DEAD
);
1017 a
->result
= AUTOMOUNT_SUCCESS
;
1020 static bool automount_supported(void) {
1021 static int supported
= -1;
1024 supported
= access("/dev/autofs", F_OK
) >= 0;
1029 static const char* const automount_result_table
[_AUTOMOUNT_RESULT_MAX
] = {
1030 [AUTOMOUNT_SUCCESS
] = "success",
1031 [AUTOMOUNT_FAILURE_RESOURCES
] = "resources"
1034 DEFINE_STRING_TABLE_LOOKUP(automount_result
, AutomountResult
);
1036 const UnitVTable automount_vtable
= {
1037 .object_size
= sizeof(Automount
),
1045 .no_instances
= true,
1047 .init
= automount_init
,
1048 .load
= automount_load
,
1049 .done
= automount_done
,
1051 .coldplug
= automount_coldplug
,
1053 .dump
= automount_dump
,
1055 .start
= automount_start
,
1056 .stop
= automount_stop
,
1058 .serialize
= automount_serialize
,
1059 .deserialize_item
= automount_deserialize_item
,
1061 .active_state
= automount_active_state
,
1062 .sub_state_to_string
= automount_sub_state_to_string
,
1064 .check_gc
= automount_check_gc
,
1066 .reset_failed
= automount_reset_failed
,
1068 .bus_vtable
= bus_automount_vtable
,
1070 .shutdown
= automount_shutdown
,
1071 .supported
= automount_supported
,
1073 .status_message_formats
= {
1074 .finished_start_job
= {
1075 [JOB_DONE
] = "Set up automount %s.",
1076 [JOB_FAILED
] = "Failed to set up automount %s.",
1078 .finished_stop_job
= {
1079 [JOB_DONE
] = "Unset automount %s.",
1080 [JOB_FAILED
] = "Failed to unset automount %s.",