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 int automount_send_ready(Automount
*a
, Set
*tokens
, int status
);
94 static void unmount_autofs(Automount
*a
) {
102 automount_send_ready(a
, a
->tokens
, -EHOSTDOWN
);
103 automount_send_ready(a
, a
->expire_tokens
, -EHOSTDOWN
);
105 a
->pipe_event_source
= sd_event_source_unref(a
->pipe_event_source
);
106 a
->pipe_fd
= safe_close(a
->pipe_fd
);
108 /* If we reload/reexecute things we keep the mount point
111 (UNIT(a
)->manager
->exit_code
!= MANAGER_RELOAD
&&
112 UNIT(a
)->manager
->exit_code
!= MANAGER_REEXECUTE
)) {
113 r
= repeat_unmount(a
->where
, MNT_DETACH
);
115 log_error_errno(r
, "Failed to unmount: %m");
119 static void automount_done(Unit
*u
) {
120 Automount
*a
= AUTOMOUNT(u
);
126 a
->where
= mfree(a
->where
);
128 a
->tokens
= set_free(a
->tokens
);
129 a
->expire_tokens
= set_free(a
->expire_tokens
);
131 a
->expire_event_source
= sd_event_source_unref(a
->expire_event_source
);
134 static int automount_add_mount_links(Automount
*a
) {
135 _cleanup_free_
char *parent
= NULL
;
139 parent
= dirname_malloc(a
->where
);
143 return unit_require_mounts_for(UNIT(a
), parent
);
146 static int automount_add_default_dependencies(Automount
*a
) {
151 if (UNIT(a
)->manager
->running_as
!= MANAGER_SYSTEM
)
154 r
= unit_add_two_dependencies_by_name(UNIT(a
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
161 static int automount_verify(Automount
*a
) {
162 _cleanup_free_
char *e
= NULL
;
167 if (UNIT(a
)->load_state
!= UNIT_LOADED
)
170 if (path_equal(a
->where
, "/")) {
171 log_unit_error(UNIT(a
), "Cannot have an automount unit for the root directory. Refusing.");
175 r
= unit_name_from_path(a
->where
, ".automount", &e
);
177 return log_unit_error(UNIT(a
), "Failed to generate unit name from path: %m");
179 if (!unit_has_name(UNIT(a
), e
)) {
180 log_unit_error(UNIT(a
), "Where= setting doesn't match unit name. Refusing.");
187 static int automount_load(Unit
*u
) {
188 Automount
*a
= AUTOMOUNT(u
);
192 assert(u
->load_state
== UNIT_STUB
);
194 /* Load a .automount file */
195 r
= unit_load_fragment_and_dropin_optional(u
);
199 if (u
->load_state
== UNIT_LOADED
) {
203 r
= unit_name_to_path(u
->id
, &a
->where
);
208 path_kill_slashes(a
->where
);
210 r
= unit_load_related_unit(u
, ".mount", &x
);
214 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, x
, true);
218 r
= automount_add_mount_links(a
);
222 if (UNIT(a
)->default_dependencies
) {
223 r
= automount_add_default_dependencies(a
);
229 return automount_verify(a
);
232 static void automount_set_state(Automount
*a
, AutomountState state
) {
233 AutomountState old_state
;
236 old_state
= a
->state
;
239 if (state
!= AUTOMOUNT_WAITING
&&
240 state
!= AUTOMOUNT_RUNNING
)
243 if (state
!= old_state
)
244 log_unit_debug(UNIT(a
), "Changed %s -> %s", automount_state_to_string(old_state
), automount_state_to_string(state
));
246 unit_notify(UNIT(a
), state_translation_table
[old_state
], state_translation_table
[state
], true);
249 static int automount_coldplug(Unit
*u
) {
250 Automount
*a
= AUTOMOUNT(u
);
254 assert(a
->state
== AUTOMOUNT_DEAD
);
256 if (a
->deserialized_state
!= a
->state
) {
258 r
= open_dev_autofs(u
->manager
);
262 if (a
->deserialized_state
== AUTOMOUNT_WAITING
||
263 a
->deserialized_state
== AUTOMOUNT_RUNNING
) {
264 assert(a
->pipe_fd
>= 0);
266 r
= sd_event_add_io(u
->manager
->event
, &a
->pipe_event_source
, a
->pipe_fd
, EPOLLIN
, automount_dispatch_io
, u
);
270 (void) sd_event_source_set_description(a
->pipe_event_source
, "automount-io");
273 automount_set_state(a
, a
->deserialized_state
);
279 static void automount_dump(Unit
*u
, FILE *f
, const char *prefix
) {
280 char time_string
[FORMAT_TIMESPAN_MAX
];
281 Automount
*a
= AUTOMOUNT(u
);
286 "%sAutomount State: %s\n"
289 "%sDirectoryMode: %04o\n"
290 "%sTimeoutIdleUSec: %s\n",
291 prefix
, automount_state_to_string(a
->state
),
292 prefix
, automount_result_to_string(a
->result
),
294 prefix
, a
->directory_mode
,
295 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, a
->timeout_idle_usec
, USEC_PER_SEC
));
298 static void automount_enter_dead(Automount
*a
, AutomountResult f
) {
301 if (f
!= AUTOMOUNT_SUCCESS
)
304 automount_set_state(a
, a
->result
!= AUTOMOUNT_SUCCESS
? AUTOMOUNT_FAILED
: AUTOMOUNT_DEAD
);
307 static int open_dev_autofs(Manager
*m
) {
308 struct autofs_dev_ioctl param
;
312 if (m
->dev_autofs_fd
>= 0)
313 return m
->dev_autofs_fd
;
315 label_fix("/dev/autofs", false, false);
317 m
->dev_autofs_fd
= open("/dev/autofs", O_CLOEXEC
|O_RDONLY
);
318 if (m
->dev_autofs_fd
< 0)
319 return log_error_errno(errno
, "Failed to open /dev/autofs: %m");
321 init_autofs_dev_ioctl(¶m
);
322 if (ioctl(m
->dev_autofs_fd
, AUTOFS_DEV_IOCTL_VERSION
, ¶m
) < 0) {
323 m
->dev_autofs_fd
= safe_close(m
->dev_autofs_fd
);
327 log_debug("Autofs kernel version %i.%i", param
.ver_major
, param
.ver_minor
);
329 return m
->dev_autofs_fd
;
332 static int open_ioctl_fd(int dev_autofs_fd
, const char *where
, dev_t devid
) {
333 struct autofs_dev_ioctl
*param
;
336 assert(dev_autofs_fd
>= 0);
339 l
= sizeof(struct autofs_dev_ioctl
) + strlen(where
) + 1;
342 init_autofs_dev_ioctl(param
);
345 param
->openmount
.devid
= devid
;
346 strcpy(param
->path
, where
);
348 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_OPENMOUNT
, param
) < 0)
351 if (param
->ioctlfd
< 0)
354 (void) fd_cloexec(param
->ioctlfd
, true);
355 return param
->ioctlfd
;
358 static int autofs_protocol(int dev_autofs_fd
, int ioctl_fd
) {
359 uint32_t major
, minor
;
360 struct autofs_dev_ioctl param
;
362 assert(dev_autofs_fd
>= 0);
363 assert(ioctl_fd
>= 0);
365 init_autofs_dev_ioctl(¶m
);
366 param
.ioctlfd
= ioctl_fd
;
368 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_PROTOVER
, ¶m
) < 0)
371 major
= param
.protover
.version
;
373 init_autofs_dev_ioctl(¶m
);
374 param
.ioctlfd
= ioctl_fd
;
376 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_PROTOSUBVER
, ¶m
) < 0)
379 minor
= param
.protosubver
.sub_version
;
381 log_debug("Autofs protocol version %i.%i", major
, minor
);
385 static int autofs_set_timeout(int dev_autofs_fd
, int ioctl_fd
, usec_t usec
) {
386 struct autofs_dev_ioctl param
;
388 assert(dev_autofs_fd
>= 0);
389 assert(ioctl_fd
>= 0);
391 init_autofs_dev_ioctl(¶m
);
392 param
.ioctlfd
= ioctl_fd
;
394 /* Convert to seconds, rounding up. */
395 param
.timeout
.timeout
= (usec
+ USEC_PER_SEC
- 1) / USEC_PER_SEC
;
397 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_TIMEOUT
, ¶m
) < 0)
403 static int autofs_send_ready(int dev_autofs_fd
, int ioctl_fd
, uint32_t token
, int status
) {
404 struct autofs_dev_ioctl param
;
406 assert(dev_autofs_fd
>= 0);
407 assert(ioctl_fd
>= 0);
409 init_autofs_dev_ioctl(¶m
);
410 param
.ioctlfd
= ioctl_fd
;
413 param
.fail
.token
= token
;
414 param
.fail
.status
= status
;
416 param
.ready
.token
= token
;
418 if (ioctl(dev_autofs_fd
, status
? AUTOFS_DEV_IOCTL_FAIL
: AUTOFS_DEV_IOCTL_READY
, ¶m
) < 0)
424 static int automount_send_ready(Automount
*a
, Set
*tokens
, int status
) {
425 _cleanup_close_
int ioctl_fd
= -1;
432 if (set_isempty(tokens
))
435 ioctl_fd
= open_ioctl_fd(UNIT(a
)->manager
->dev_autofs_fd
, a
->where
, a
->dev_id
);
440 log_unit_debug_errno(UNIT(a
), status
, "Sending failure: %m");
442 log_unit_debug(UNIT(a
), "Sending success.");
446 /* Autofs thankfully does not hand out 0 as a token */
447 while ((token
= PTR_TO_UINT(set_steal_first(tokens
)))) {
450 /* Autofs fun fact II:
452 * if you pass a positive status code here, the kernel will
455 k
= autofs_send_ready(UNIT(a
)->manager
->dev_autofs_fd
,
466 static int automount_start_expire(Automount
*a
);
468 int automount_update_mount(Automount
*a
, MountState old_state
, MountState state
) {
475 case MOUNT_REMOUNTING
:
476 automount_send_ready(a
, a
->tokens
, 0);
477 r
= automount_start_expire(a
);
479 log_unit_warning_errno(UNIT(a
), r
, "Failed to start expiration timer, ignoring: %m");
482 case MOUNT_UNMOUNTING
:
483 case MOUNT_MOUNTING_SIGTERM
:
484 case MOUNT_MOUNTING_SIGKILL
:
485 case MOUNT_REMOUNTING_SIGTERM
:
486 case MOUNT_REMOUNTING_SIGKILL
:
487 case MOUNT_UNMOUNTING_SIGTERM
:
488 case MOUNT_UNMOUNTING_SIGKILL
:
490 if (old_state
!= state
)
491 automount_send_ready(a
, a
->tokens
, -ENODEV
);
492 (void) sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_OFF
);
500 automount_send_ready(a
, a
->expire_tokens
, 0);
503 case MOUNT_MOUNTING_DONE
:
504 case MOUNT_MOUNTING_SIGTERM
:
505 case MOUNT_MOUNTING_SIGKILL
:
506 case MOUNT_REMOUNTING_SIGTERM
:
507 case MOUNT_REMOUNTING_SIGKILL
:
508 case MOUNT_UNMOUNTING_SIGTERM
:
509 case MOUNT_UNMOUNTING_SIGKILL
:
511 if (old_state
!= state
)
512 automount_send_ready(a
, a
->expire_tokens
, -ENODEV
);
521 static void automount_enter_waiting(Automount
*a
) {
522 _cleanup_close_
int ioctl_fd
= -1;
523 int p
[2] = { -1, -1 };
524 char name
[sizeof("systemd-")-1 + DECIMAL_STR_MAX(pid_t
) + 1];
525 char options
[sizeof("fd=,pgrp=,minproto=5,maxproto=5,direct")-1
526 + DECIMAL_STR_MAX(int) + DECIMAL_STR_MAX(gid_t
) + 1];
527 bool mounted
= false;
528 int r
, dev_autofs_fd
;
532 assert(a
->pipe_fd
< 0);
535 set_clear(a
->tokens
);
537 r
= unit_fail_if_symlink(UNIT(a
), a
->where
);
541 (void) mkdir_p_label(a
->where
, 0555);
543 unit_warn_if_dir_nonempty(UNIT(a
), a
->where
);
545 dev_autofs_fd
= open_dev_autofs(UNIT(a
)->manager
);
546 if (dev_autofs_fd
< 0) {
551 if (pipe2(p
, O_NONBLOCK
|O_CLOEXEC
) < 0) {
556 xsprintf(options
, "fd=%i,pgrp="PID_FMT
",minproto=5,maxproto=5,direct", p
[1], getpgrp());
557 xsprintf(name
, "systemd-"PID_FMT
, getpid());
558 if (mount(name
, a
->where
, "autofs", 0, options
) < 0) {
565 p
[1] = safe_close(p
[1]);
567 if (stat(a
->where
, &st
) < 0) {
572 ioctl_fd
= open_ioctl_fd(dev_autofs_fd
, a
->where
, st
.st_dev
);
578 r
= autofs_protocol(dev_autofs_fd
, ioctl_fd
);
582 r
= autofs_set_timeout(dev_autofs_fd
, ioctl_fd
, a
->timeout_idle_usec
);
588 * Unless we close the ioctl fd here, for some weird reason
589 * the direct mount will not receive events from the
592 r
= sd_event_add_io(UNIT(a
)->manager
->event
, &a
->pipe_event_source
, p
[0], EPOLLIN
, automount_dispatch_io
, a
);
596 (void) sd_event_source_set_description(a
->pipe_event_source
, "automount-io");
599 a
->dev_id
= st
.st_dev
;
601 automount_set_state(a
, AUTOMOUNT_WAITING
);
606 log_unit_error_errno(UNIT(a
), r
, "Failed to initialize automounter: %m");
611 r
= repeat_unmount(a
->where
, MNT_DETACH
);
613 log_error_errno(r
, "Failed to unmount, ignoring: %m");
616 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
619 static void *expire_thread(void *p
) {
620 struct autofs_dev_ioctl param
;
621 _cleanup_(expire_data_freep
) struct expire_data
*data
= (struct expire_data
*)p
;
624 assert(data
->dev_autofs_fd
>= 0);
625 assert(data
->ioctl_fd
>= 0);
627 init_autofs_dev_ioctl(¶m
);
628 param
.ioctlfd
= data
->ioctl_fd
;
631 r
= ioctl(data
->dev_autofs_fd
, AUTOFS_DEV_IOCTL_EXPIRE
, ¶m
);
635 log_warning_errno(errno
, "Failed to expire automount, ignoring: %m");
640 static int automount_dispatch_expire(sd_event_source
*source
, usec_t usec
, void *userdata
) {
641 Automount
*a
= AUTOMOUNT(userdata
);
642 _cleanup_(expire_data_freep
) struct expire_data
*data
= NULL
;
646 assert(source
== a
->expire_event_source
);
648 data
= new0(struct expire_data
, 1);
654 data
->dev_autofs_fd
= fcntl(UNIT(a
)->manager
->dev_autofs_fd
, F_DUPFD_CLOEXEC
, 3);
655 if (data
->dev_autofs_fd
< 0)
656 return log_unit_error_errno(UNIT(a
), errno
, "Failed to duplicate autofs fd: %m");
658 data
->ioctl_fd
= open_ioctl_fd(UNIT(a
)->manager
->dev_autofs_fd
, a
->where
, a
->dev_id
);
659 if (data
->ioctl_fd
< 0)
660 return log_unit_error_errno(UNIT(a
), data
->ioctl_fd
, "Couldn't open autofs ioctl fd: %m");
662 r
= asynchronous_job(expire_thread
, data
);
664 return log_unit_error_errno(UNIT(a
), r
, "Failed to start expire job: %m");
668 return automount_start_expire(a
);
671 static int automount_start_expire(Automount
*a
) {
677 if (a
->timeout_idle_usec
== 0)
680 timeout
= now(CLOCK_MONOTONIC
) + MAX(a
->timeout_idle_usec
/3, USEC_PER_SEC
);
682 if (a
->expire_event_source
) {
683 r
= sd_event_source_set_time(a
->expire_event_source
, timeout
);
687 return sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_ONESHOT
);
690 r
= sd_event_add_time(
691 UNIT(a
)->manager
->event
,
692 &a
->expire_event_source
,
693 CLOCK_MONOTONIC
, timeout
, 0,
694 automount_dispatch_expire
, a
);
698 (void) sd_event_source_set_description(a
->expire_event_source
, "automount-expire");
703 static void automount_enter_runnning(Automount
*a
) {
704 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
710 /* We don't take mount requests anymore if we are supposed to
711 * shut down anyway */
712 if (unit_stop_pending(UNIT(a
))) {
713 log_unit_debug(UNIT(a
), "Suppressing automount request since unit stop is scheduled.");
714 automount_send_ready(a
, a
->tokens
, -EHOSTDOWN
);
715 automount_send_ready(a
, a
->expire_tokens
, -EHOSTDOWN
);
719 mkdir_p_label(a
->where
, a
->directory_mode
);
721 /* Before we do anything, let's see if somebody is playing games with us? */
722 if (lstat(a
->where
, &st
) < 0) {
723 log_unit_warning_errno(UNIT(a
), errno
, "Failed to stat automount point: %m");
727 if (!S_ISDIR(st
.st_mode
) || st
.st_dev
!= a
->dev_id
)
728 log_unit_info(UNIT(a
), "Automount point already active?");
730 r
= manager_add_job(UNIT(a
)->manager
, JOB_START
, UNIT_TRIGGER(UNIT(a
)),
731 JOB_REPLACE
, true, &error
, NULL
);
733 log_unit_warning(UNIT(a
), "Failed to queue mount startup job: %s", bus_error_message(&error
, r
));
738 automount_set_state(a
, AUTOMOUNT_RUNNING
);
742 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
745 static int automount_start(Unit
*u
) {
746 Automount
*a
= AUTOMOUNT(u
);
749 assert(a
->state
== AUTOMOUNT_DEAD
|| a
->state
== AUTOMOUNT_FAILED
);
751 if (path_is_mount_point(a
->where
, 0) > 0) {
752 log_unit_error(u
, "Path %s is already a mount point, refusing start.", a
->where
);
756 if (UNIT_TRIGGER(u
)->load_state
!= UNIT_LOADED
)
759 a
->result
= AUTOMOUNT_SUCCESS
;
760 automount_enter_waiting(a
);
764 static int automount_stop(Unit
*u
) {
765 Automount
*a
= AUTOMOUNT(u
);
768 assert(a
->state
== AUTOMOUNT_WAITING
|| a
->state
== AUTOMOUNT_RUNNING
);
770 automount_enter_dead(a
, AUTOMOUNT_SUCCESS
);
774 static int automount_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
775 Automount
*a
= AUTOMOUNT(u
);
784 unit_serialize_item(u
, f
, "state", automount_state_to_string(a
->state
));
785 unit_serialize_item(u
, f
, "result", automount_result_to_string(a
->result
));
786 unit_serialize_item_format(u
, f
, "dev-id", "%u", (unsigned) a
->dev_id
);
788 SET_FOREACH(p
, a
->tokens
, i
)
789 unit_serialize_item_format(u
, f
, "token", "%u", PTR_TO_UINT(p
));
790 SET_FOREACH(p
, a
->expire_tokens
, i
)
791 unit_serialize_item_format(u
, f
, "expire-token", "%u", PTR_TO_UINT(p
));
793 r
= unit_serialize_item_fd(u
, f
, fds
, "pipe-fd", a
->pipe_fd
);
800 static int automount_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
801 Automount
*a
= AUTOMOUNT(u
);
807 if (streq(key
, "state")) {
808 AutomountState state
;
810 state
= automount_state_from_string(value
);
812 log_unit_debug(u
, "Failed to parse state value: %s", value
);
814 a
->deserialized_state
= state
;
815 } else if (streq(key
, "result")) {
818 f
= automount_result_from_string(value
);
820 log_unit_debug(u
, "Failed to parse result value: %s", value
);
821 else if (f
!= AUTOMOUNT_SUCCESS
)
824 } else if (streq(key
, "dev-id")) {
827 if (safe_atou(value
, &d
) < 0)
828 log_unit_debug(u
, "Failed to parse dev-id value: %s", value
);
830 a
->dev_id
= (unsigned) d
;
831 } else if (streq(key
, "token")) {
834 if (safe_atou(value
, &token
) < 0)
835 log_unit_debug(u
, "Failed to parse token value: %s", value
);
837 r
= set_ensure_allocated(&a
->tokens
, NULL
);
843 r
= set_put(a
->tokens
, UINT_TO_PTR(token
));
845 log_unit_error_errno(u
, r
, "Failed to add token to set: %m");
847 } else if (streq(key
, "expire-token")) {
850 if (safe_atou(value
, &token
) < 0)
851 log_unit_debug(u
, "Failed to parse token value: %s", value
);
853 r
= set_ensure_allocated(&a
->expire_tokens
, NULL
);
859 r
= set_put(a
->expire_tokens
, UINT_TO_PTR(token
));
861 log_unit_error_errno(u
, r
, "Failed to add expire token to set: %m");
863 } else if (streq(key
, "pipe-fd")) {
866 if (safe_atoi(value
, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
867 log_unit_debug(u
, "Failed to parse pipe-fd value: %s", value
);
869 safe_close(a
->pipe_fd
);
870 a
->pipe_fd
= fdset_remove(fds
, fd
);
873 log_unit_debug(u
, "Unknown serialization key: %s", key
);
878 static UnitActiveState
automount_active_state(Unit
*u
) {
881 return state_translation_table
[AUTOMOUNT(u
)->state
];
884 static const char *automount_sub_state_to_string(Unit
*u
) {
887 return automount_state_to_string(AUTOMOUNT(u
)->state
);
890 static bool automount_check_gc(Unit
*u
) {
893 if (!UNIT_TRIGGER(u
))
896 return UNIT_VTABLE(UNIT_TRIGGER(u
))->check_gc(UNIT_TRIGGER(u
));
899 static int automount_dispatch_io(sd_event_source
*s
, int fd
, uint32_t events
, void *userdata
) {
900 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
901 union autofs_v5_packet_union packet
;
902 Automount
*a
= AUTOMOUNT(userdata
);
907 assert(fd
== a
->pipe_fd
);
909 if (events
!= EPOLLIN
) {
910 log_unit_error(UNIT(a
), "Got invalid poll event %"PRIu32
" on pipe (fd=%d)", events
, fd
);
914 r
= loop_read_exact(a
->pipe_fd
, &packet
, sizeof(packet
), true);
916 log_unit_error_errno(UNIT(a
), r
, "Invalid read from pipe: %m");
920 switch (packet
.hdr
.type
) {
922 case autofs_ptype_missing_direct
:
924 if (packet
.v5_packet
.pid
> 0) {
925 _cleanup_free_
char *p
= NULL
;
927 get_process_comm(packet
.v5_packet
.pid
, &p
);
928 log_unit_info(UNIT(a
), "Got automount request for %s, triggered by %"PRIu32
" (%s)", a
->where
, packet
.v5_packet
.pid
, strna(p
));
930 log_unit_debug(UNIT(a
), "Got direct mount request on %s", a
->where
);
932 r
= set_ensure_allocated(&a
->tokens
, NULL
);
934 log_unit_error(UNIT(a
), "Failed to allocate token set.");
938 r
= set_put(a
->tokens
, UINT_TO_PTR(packet
.v5_packet
.wait_queue_token
));
940 log_unit_error_errno(UNIT(a
), r
, "Failed to remember token: %m");
944 automount_enter_runnning(a
);
947 case autofs_ptype_expire_direct
:
948 log_unit_debug(UNIT(a
), "Got direct umount request on %s", a
->where
);
950 (void) sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_OFF
);
952 r
= set_ensure_allocated(&a
->expire_tokens
, NULL
);
954 log_unit_error(UNIT(a
), "Failed to allocate token set.");
958 r
= set_put(a
->expire_tokens
, UINT_TO_PTR(packet
.v5_packet
.wait_queue_token
));
960 log_unit_error_errno(UNIT(a
), r
, "Failed to remember token: %m");
964 /* Before we do anything, let's see if somebody is playing games with us? */
965 if (lstat(a
->where
, &st
) < 0) {
966 log_unit_warning_errno(UNIT(a
), errno
, "Failed to stat automount point: %m");
970 if (!S_ISDIR(st
.st_mode
) || st
.st_dev
== a
->dev_id
) {
971 log_unit_info(UNIT(a
), "Automount point already unmounted?");
972 automount_send_ready(a
, a
->expire_tokens
, 0);
976 r
= manager_add_job(UNIT(a
)->manager
, JOB_STOP
, UNIT_TRIGGER(UNIT(a
)), JOB_REPLACE
, true, &error
, NULL
);
978 log_unit_warning(UNIT(a
), "Failed to queue umount startup job: %s", bus_error_message(&error
, r
));
984 log_unit_error(UNIT(a
), "Received unknown automount request %i", packet
.hdr
.type
);
991 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
995 static void automount_shutdown(Manager
*m
) {
998 m
->dev_autofs_fd
= safe_close(m
->dev_autofs_fd
);
1001 static void automount_reset_failed(Unit
*u
) {
1002 Automount
*a
= AUTOMOUNT(u
);
1006 if (a
->state
== AUTOMOUNT_FAILED
)
1007 automount_set_state(a
, AUTOMOUNT_DEAD
);
1009 a
->result
= AUTOMOUNT_SUCCESS
;
1012 static bool automount_supported(void) {
1013 static int supported
= -1;
1016 supported
= access("/dev/autofs", F_OK
) >= 0;
1021 static const char* const automount_result_table
[_AUTOMOUNT_RESULT_MAX
] = {
1022 [AUTOMOUNT_SUCCESS
] = "success",
1023 [AUTOMOUNT_FAILURE_RESOURCES
] = "resources"
1026 DEFINE_STRING_TABLE_LOOKUP(automount_result
, AutomountResult
);
1028 const UnitVTable automount_vtable
= {
1029 .object_size
= sizeof(Automount
),
1037 .no_instances
= true,
1039 .init
= automount_init
,
1040 .load
= automount_load
,
1041 .done
= automount_done
,
1043 .coldplug
= automount_coldplug
,
1045 .dump
= automount_dump
,
1047 .start
= automount_start
,
1048 .stop
= automount_stop
,
1050 .serialize
= automount_serialize
,
1051 .deserialize_item
= automount_deserialize_item
,
1053 .active_state
= automount_active_state
,
1054 .sub_state_to_string
= automount_sub_state_to_string
,
1056 .check_gc
= automount_check_gc
,
1058 .reset_failed
= automount_reset_failed
,
1060 .bus_vtable
= bus_automount_vtable
,
1062 .shutdown
= automount_shutdown
,
1063 .supported
= automount_supported
,
1065 .status_message_formats
= {
1066 .finished_start_job
= {
1067 [JOB_DONE
] = "Set up automount %s.",
1068 [JOB_FAILED
] = "Failed to set up automount %s.",
1070 .finished_stop_job
= {
1071 [JOB_DONE
] = "Unset automount %s.",
1072 [JOB_FAILED
] = "Failed to unset automount %s.",