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>
33 #include "automount.h"
34 #include "bus-error.h"
36 #include "dbus-automount.h"
38 #include "formats-util.h"
42 #include "path-util.h"
43 #include "process-util.h"
45 #include "string-util.h"
46 #include "unit-name.h"
49 static const UnitActiveState state_translation_table
[_AUTOMOUNT_STATE_MAX
] = {
50 [AUTOMOUNT_DEAD
] = UNIT_INACTIVE
,
51 [AUTOMOUNT_WAITING
] = UNIT_ACTIVE
,
52 [AUTOMOUNT_RUNNING
] = UNIT_ACTIVE
,
53 [AUTOMOUNT_FAILED
] = UNIT_FAILED
61 static inline void expire_data_free(struct expire_data
*data
) {
65 safe_close(data
->dev_autofs_fd
);
66 safe_close(data
->ioctl_fd
);
70 DEFINE_TRIVIAL_CLEANUP_FUNC(struct expire_data
*, expire_data_free
);
72 static int open_dev_autofs(Manager
*m
);
73 static int automount_dispatch_io(sd_event_source
*s
, int fd
, uint32_t events
, void *userdata
);
75 static void automount_init(Unit
*u
) {
76 Automount
*a
= AUTOMOUNT(u
);
79 assert(u
->load_state
== UNIT_STUB
);
82 a
->directory_mode
= 0755;
83 UNIT(a
)->ignore_on_isolate
= true;
86 static void repeat_unmount(const char *path
) {
90 /* If there are multiple mounts on a mount point, this
93 if (umount2(path
, MNT_DETACH
) >= 0)
97 log_error_errno(errno
, "Failed to unmount: %m");
103 static int automount_send_ready(Automount
*a
, Set
*tokens
, int status
);
105 static void unmount_autofs(Automount
*a
) {
111 automount_send_ready(a
, a
->tokens
, -EHOSTDOWN
);
112 automount_send_ready(a
, a
->expire_tokens
, -EHOSTDOWN
);
114 a
->pipe_event_source
= sd_event_source_unref(a
->pipe_event_source
);
115 a
->pipe_fd
= safe_close(a
->pipe_fd
);
117 /* If we reload/reexecute things we keep the mount point
120 (UNIT(a
)->manager
->exit_code
!= MANAGER_RELOAD
&&
121 UNIT(a
)->manager
->exit_code
!= MANAGER_REEXECUTE
))
122 repeat_unmount(a
->where
);
125 static void automount_done(Unit
*u
) {
126 Automount
*a
= AUTOMOUNT(u
);
132 a
->where
= mfree(a
->where
);
134 a
->tokens
= set_free(a
->tokens
);
135 a
->expire_tokens
= set_free(a
->expire_tokens
);
137 a
->expire_event_source
= sd_event_source_unref(a
->expire_event_source
);
140 static int automount_add_mount_links(Automount
*a
) {
141 _cleanup_free_
char *parent
= NULL
;
146 r
= path_get_parent(a
->where
, &parent
);
150 return unit_require_mounts_for(UNIT(a
), parent
);
153 static int automount_add_default_dependencies(Automount
*a
) {
158 if (UNIT(a
)->manager
->running_as
!= MANAGER_SYSTEM
)
161 r
= unit_add_two_dependencies_by_name(UNIT(a
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
168 static int automount_verify(Automount
*a
) {
169 _cleanup_free_
char *e
= NULL
;
174 if (UNIT(a
)->load_state
!= UNIT_LOADED
)
177 if (path_equal(a
->where
, "/")) {
178 log_unit_error(UNIT(a
), "Cannot have an automount unit for the root directory. Refusing.");
182 r
= unit_name_from_path(a
->where
, ".automount", &e
);
184 return log_unit_error(UNIT(a
), "Failed to generate unit name from path: %m");
186 if (!unit_has_name(UNIT(a
), e
)) {
187 log_unit_error(UNIT(a
), "Where= setting doesn't match unit name. Refusing.");
194 static int automount_load(Unit
*u
) {
195 Automount
*a
= AUTOMOUNT(u
);
199 assert(u
->load_state
== UNIT_STUB
);
201 /* Load a .automount file */
202 r
= unit_load_fragment_and_dropin_optional(u
);
206 if (u
->load_state
== UNIT_LOADED
) {
210 r
= unit_name_to_path(u
->id
, &a
->where
);
215 path_kill_slashes(a
->where
);
217 r
= unit_load_related_unit(u
, ".mount", &x
);
221 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, x
, true);
225 r
= automount_add_mount_links(a
);
229 if (UNIT(a
)->default_dependencies
) {
230 r
= automount_add_default_dependencies(a
);
236 return automount_verify(a
);
239 static void automount_set_state(Automount
*a
, AutomountState state
) {
240 AutomountState old_state
;
243 old_state
= a
->state
;
246 if (state
!= AUTOMOUNT_WAITING
&&
247 state
!= AUTOMOUNT_RUNNING
)
250 if (state
!= old_state
)
251 log_unit_debug(UNIT(a
), "Changed %s -> %s", automount_state_to_string(old_state
), automount_state_to_string(state
));
253 unit_notify(UNIT(a
), state_translation_table
[old_state
], state_translation_table
[state
], true);
256 static int automount_coldplug(Unit
*u
) {
257 Automount
*a
= AUTOMOUNT(u
);
261 assert(a
->state
== AUTOMOUNT_DEAD
);
263 if (a
->deserialized_state
!= a
->state
) {
265 r
= open_dev_autofs(u
->manager
);
269 if (a
->deserialized_state
== AUTOMOUNT_WAITING
||
270 a
->deserialized_state
== AUTOMOUNT_RUNNING
) {
271 assert(a
->pipe_fd
>= 0);
273 r
= sd_event_add_io(u
->manager
->event
, &a
->pipe_event_source
, a
->pipe_fd
, EPOLLIN
, automount_dispatch_io
, u
);
277 (void) sd_event_source_set_description(a
->pipe_event_source
, "automount-io");
280 automount_set_state(a
, a
->deserialized_state
);
286 static void automount_dump(Unit
*u
, FILE *f
, const char *prefix
) {
287 char time_string
[FORMAT_TIMESPAN_MAX
];
288 Automount
*a
= AUTOMOUNT(u
);
293 "%sAutomount State: %s\n"
296 "%sDirectoryMode: %04o\n"
297 "%sTimeoutIdleUSec: %s\n",
298 prefix
, automount_state_to_string(a
->state
),
299 prefix
, automount_result_to_string(a
->result
),
301 prefix
, a
->directory_mode
,
302 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, a
->timeout_idle_usec
, USEC_PER_SEC
));
305 static void automount_enter_dead(Automount
*a
, AutomountResult f
) {
308 if (f
!= AUTOMOUNT_SUCCESS
)
311 automount_set_state(a
, a
->result
!= AUTOMOUNT_SUCCESS
? AUTOMOUNT_FAILED
: AUTOMOUNT_DEAD
);
314 static int open_dev_autofs(Manager
*m
) {
315 struct autofs_dev_ioctl param
;
319 if (m
->dev_autofs_fd
>= 0)
320 return m
->dev_autofs_fd
;
322 label_fix("/dev/autofs", false, false);
324 m
->dev_autofs_fd
= open("/dev/autofs", O_CLOEXEC
|O_RDONLY
);
325 if (m
->dev_autofs_fd
< 0)
326 return log_error_errno(errno
, "Failed to open /dev/autofs: %m");
328 init_autofs_dev_ioctl(¶m
);
329 if (ioctl(m
->dev_autofs_fd
, AUTOFS_DEV_IOCTL_VERSION
, ¶m
) < 0) {
330 m
->dev_autofs_fd
= safe_close(m
->dev_autofs_fd
);
334 log_debug("Autofs kernel version %i.%i", param
.ver_major
, param
.ver_minor
);
336 return m
->dev_autofs_fd
;
339 static int open_ioctl_fd(int dev_autofs_fd
, const char *where
, dev_t devid
) {
340 struct autofs_dev_ioctl
*param
;
343 assert(dev_autofs_fd
>= 0);
346 l
= sizeof(struct autofs_dev_ioctl
) + strlen(where
) + 1;
349 init_autofs_dev_ioctl(param
);
352 param
->openmount
.devid
= devid
;
353 strcpy(param
->path
, where
);
355 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_OPENMOUNT
, param
) < 0)
358 if (param
->ioctlfd
< 0)
361 (void) fd_cloexec(param
->ioctlfd
, true);
362 return param
->ioctlfd
;
365 static int autofs_protocol(int dev_autofs_fd
, int ioctl_fd
) {
366 uint32_t major
, minor
;
367 struct autofs_dev_ioctl param
;
369 assert(dev_autofs_fd
>= 0);
370 assert(ioctl_fd
>= 0);
372 init_autofs_dev_ioctl(¶m
);
373 param
.ioctlfd
= ioctl_fd
;
375 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_PROTOVER
, ¶m
) < 0)
378 major
= param
.protover
.version
;
380 init_autofs_dev_ioctl(¶m
);
381 param
.ioctlfd
= ioctl_fd
;
383 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_PROTOSUBVER
, ¶m
) < 0)
386 minor
= param
.protosubver
.sub_version
;
388 log_debug("Autofs protocol version %i.%i", major
, minor
);
392 static int autofs_set_timeout(int dev_autofs_fd
, int ioctl_fd
, usec_t usec
) {
393 struct autofs_dev_ioctl param
;
395 assert(dev_autofs_fd
>= 0);
396 assert(ioctl_fd
>= 0);
398 init_autofs_dev_ioctl(¶m
);
399 param
.ioctlfd
= ioctl_fd
;
401 /* Convert to seconds, rounding up. */
402 param
.timeout
.timeout
= (usec
+ USEC_PER_SEC
- 1) / USEC_PER_SEC
;
404 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_TIMEOUT
, ¶m
) < 0)
410 static int autofs_send_ready(int dev_autofs_fd
, int ioctl_fd
, uint32_t token
, int status
) {
411 struct autofs_dev_ioctl param
;
413 assert(dev_autofs_fd
>= 0);
414 assert(ioctl_fd
>= 0);
416 init_autofs_dev_ioctl(¶m
);
417 param
.ioctlfd
= ioctl_fd
;
420 param
.fail
.token
= token
;
421 param
.fail
.status
= status
;
423 param
.ready
.token
= token
;
425 if (ioctl(dev_autofs_fd
, status
? AUTOFS_DEV_IOCTL_FAIL
: AUTOFS_DEV_IOCTL_READY
, ¶m
) < 0)
431 static int automount_send_ready(Automount
*a
, Set
*tokens
, int status
) {
432 _cleanup_close_
int ioctl_fd
= -1;
439 if (set_isempty(tokens
))
442 ioctl_fd
= open_ioctl_fd(UNIT(a
)->manager
->dev_autofs_fd
, a
->where
, a
->dev_id
);
447 log_unit_debug_errno(UNIT(a
), status
, "Sending failure: %m");
449 log_unit_debug(UNIT(a
), "Sending success.");
453 /* Autofs thankfully does not hand out 0 as a token */
454 while ((token
= PTR_TO_UINT(set_steal_first(tokens
)))) {
457 /* Autofs fun fact II:
459 * if you pass a positive status code here, the kernel will
462 k
= autofs_send_ready(UNIT(a
)->manager
->dev_autofs_fd
,
473 static int automount_start_expire(Automount
*a
);
475 int automount_update_mount(Automount
*a
, MountState old_state
, MountState state
) {
482 case MOUNT_REMOUNTING
:
483 automount_send_ready(a
, a
->tokens
, 0);
484 r
= automount_start_expire(a
);
486 log_unit_warning_errno(UNIT(a
), r
, "Failed to start expiration timer, ignoring: %m");
489 case MOUNT_UNMOUNTING
:
490 case MOUNT_MOUNTING_SIGTERM
:
491 case MOUNT_MOUNTING_SIGKILL
:
492 case MOUNT_REMOUNTING_SIGTERM
:
493 case MOUNT_REMOUNTING_SIGKILL
:
494 case MOUNT_UNMOUNTING_SIGTERM
:
495 case MOUNT_UNMOUNTING_SIGKILL
:
497 if (old_state
!= state
)
498 automount_send_ready(a
, a
->tokens
, -ENODEV
);
499 (void) sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_OFF
);
507 automount_send_ready(a
, a
->expire_tokens
, 0);
510 case MOUNT_MOUNTING_DONE
:
511 case MOUNT_MOUNTING_SIGTERM
:
512 case MOUNT_MOUNTING_SIGKILL
:
513 case MOUNT_REMOUNTING_SIGTERM
:
514 case MOUNT_REMOUNTING_SIGKILL
:
515 case MOUNT_UNMOUNTING_SIGTERM
:
516 case MOUNT_UNMOUNTING_SIGKILL
:
518 if (old_state
!= state
)
519 automount_send_ready(a
, a
->expire_tokens
, -ENODEV
);
528 static void automount_enter_waiting(Automount
*a
) {
529 _cleanup_close_
int ioctl_fd
= -1;
530 int p
[2] = { -1, -1 };
531 char name
[sizeof("systemd-")-1 + DECIMAL_STR_MAX(pid_t
) + 1];
532 char options
[sizeof("fd=,pgrp=,minproto=5,maxproto=5,direct")-1
533 + DECIMAL_STR_MAX(int) + DECIMAL_STR_MAX(gid_t
) + 1];
534 bool mounted
= false;
535 int r
, dev_autofs_fd
;
539 assert(a
->pipe_fd
< 0);
542 set_clear(a
->tokens
);
544 r
= unit_fail_if_symlink(UNIT(a
), a
->where
);
548 (void) mkdir_p_label(a
->where
, 0555);
550 unit_warn_if_dir_nonempty(UNIT(a
), a
->where
);
552 dev_autofs_fd
= open_dev_autofs(UNIT(a
)->manager
);
553 if (dev_autofs_fd
< 0) {
558 if (pipe2(p
, O_NONBLOCK
|O_CLOEXEC
) < 0) {
563 xsprintf(options
, "fd=%i,pgrp="PID_FMT
",minproto=5,maxproto=5,direct", p
[1], getpgrp());
564 xsprintf(name
, "systemd-"PID_FMT
, getpid());
565 if (mount(name
, a
->where
, "autofs", 0, options
) < 0) {
572 p
[1] = safe_close(p
[1]);
574 if (stat(a
->where
, &st
) < 0) {
579 ioctl_fd
= open_ioctl_fd(dev_autofs_fd
, a
->where
, st
.st_dev
);
585 r
= autofs_protocol(dev_autofs_fd
, ioctl_fd
);
589 r
= autofs_set_timeout(dev_autofs_fd
, ioctl_fd
, a
->timeout_idle_usec
);
595 * Unless we close the ioctl fd here, for some weird reason
596 * the direct mount will not receive events from the
599 r
= sd_event_add_io(UNIT(a
)->manager
->event
, &a
->pipe_event_source
, p
[0], EPOLLIN
, automount_dispatch_io
, a
);
603 (void) sd_event_source_set_description(a
->pipe_event_source
, "automount-io");
606 a
->dev_id
= st
.st_dev
;
608 automount_set_state(a
, AUTOMOUNT_WAITING
);
616 repeat_unmount(a
->where
);
618 log_unit_error_errno(UNIT(a
), r
, "Failed to initialize automounter: %m");
619 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
622 static void *expire_thread(void *p
) {
623 struct autofs_dev_ioctl param
;
624 _cleanup_(expire_data_freep
) struct expire_data
*data
= (struct expire_data
*)p
;
627 assert(data
->dev_autofs_fd
>= 0);
628 assert(data
->ioctl_fd
>= 0);
630 init_autofs_dev_ioctl(¶m
);
631 param
.ioctlfd
= data
->ioctl_fd
;
634 r
= ioctl(data
->dev_autofs_fd
, AUTOFS_DEV_IOCTL_EXPIRE
, ¶m
);
638 log_warning_errno(errno
, "Failed to expire automount, ignoring: %m");
643 static int automount_dispatch_expire(sd_event_source
*source
, usec_t usec
, void *userdata
) {
644 Automount
*a
= AUTOMOUNT(userdata
);
645 _cleanup_(expire_data_freep
) struct expire_data
*data
= NULL
;
649 assert(source
== a
->expire_event_source
);
651 data
= new0(struct expire_data
, 1);
657 data
->dev_autofs_fd
= fcntl(UNIT(a
)->manager
->dev_autofs_fd
, F_DUPFD_CLOEXEC
, 3);
658 if (data
->dev_autofs_fd
< 0)
659 return log_unit_error_errno(UNIT(a
), errno
, "Failed to duplicate autofs fd: %m");
661 data
->ioctl_fd
= open_ioctl_fd(UNIT(a
)->manager
->dev_autofs_fd
, a
->where
, a
->dev_id
);
662 if (data
->ioctl_fd
< 0)
663 return log_unit_error_errno(UNIT(a
), data
->ioctl_fd
, "Couldn't open autofs ioctl fd: %m");
665 r
= asynchronous_job(expire_thread
, data
);
667 return log_unit_error_errno(UNIT(a
), r
, "Failed to start expire job: %m");
671 return automount_start_expire(a
);
674 static int automount_start_expire(Automount
*a
) {
680 if (a
->timeout_idle_usec
== 0)
683 timeout
= now(CLOCK_MONOTONIC
) + MAX(a
->timeout_idle_usec
/3, USEC_PER_SEC
);
685 if (a
->expire_event_source
) {
686 r
= sd_event_source_set_time(a
->expire_event_source
, timeout
);
690 return sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_ONESHOT
);
693 r
= sd_event_add_time(
694 UNIT(a
)->manager
->event
,
695 &a
->expire_event_source
,
696 CLOCK_MONOTONIC
, timeout
, 0,
697 automount_dispatch_expire
, a
);
701 (void) sd_event_source_set_description(a
->expire_event_source
, "automount-expire");
706 static void automount_enter_runnning(Automount
*a
) {
707 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
713 /* We don't take mount requests anymore if we are supposed to
714 * shut down anyway */
715 if (unit_stop_pending(UNIT(a
))) {
716 log_unit_debug(UNIT(a
), "Suppressing automount request since unit stop is scheduled.");
717 automount_send_ready(a
, a
->tokens
, -EHOSTDOWN
);
718 automount_send_ready(a
, a
->expire_tokens
, -EHOSTDOWN
);
722 mkdir_p_label(a
->where
, a
->directory_mode
);
724 /* Before we do anything, let's see if somebody is playing games with us? */
725 if (lstat(a
->where
, &st
) < 0) {
726 log_unit_warning_errno(UNIT(a
), errno
, "Failed to stat automount point: %m");
730 if (!S_ISDIR(st
.st_mode
) || st
.st_dev
!= a
->dev_id
)
731 log_unit_info(UNIT(a
), "Automount point already active?");
733 r
= manager_add_job(UNIT(a
)->manager
, JOB_START
, UNIT_TRIGGER(UNIT(a
)),
734 JOB_REPLACE
, true, &error
, NULL
);
736 log_unit_warning(UNIT(a
), "Failed to queue mount startup job: %s", bus_error_message(&error
, r
));
741 automount_set_state(a
, AUTOMOUNT_RUNNING
);
745 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
748 static int automount_start(Unit
*u
) {
749 Automount
*a
= AUTOMOUNT(u
);
752 assert(a
->state
== AUTOMOUNT_DEAD
|| a
->state
== AUTOMOUNT_FAILED
);
754 if (path_is_mount_point(a
->where
, 0) > 0) {
755 log_unit_error(u
, "Path %s is already a mount point, refusing start.", a
->where
);
759 if (UNIT_TRIGGER(u
)->load_state
!= UNIT_LOADED
)
762 a
->result
= AUTOMOUNT_SUCCESS
;
763 automount_enter_waiting(a
);
767 static int automount_stop(Unit
*u
) {
768 Automount
*a
= AUTOMOUNT(u
);
771 assert(a
->state
== AUTOMOUNT_WAITING
|| a
->state
== AUTOMOUNT_RUNNING
);
773 automount_enter_dead(a
, AUTOMOUNT_SUCCESS
);
777 static int automount_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
778 Automount
*a
= AUTOMOUNT(u
);
787 unit_serialize_item(u
, f
, "state", automount_state_to_string(a
->state
));
788 unit_serialize_item(u
, f
, "result", automount_result_to_string(a
->result
));
789 unit_serialize_item_format(u
, f
, "dev-id", "%u", (unsigned) a
->dev_id
);
791 SET_FOREACH(p
, a
->tokens
, i
)
792 unit_serialize_item_format(u
, f
, "token", "%u", PTR_TO_UINT(p
));
793 SET_FOREACH(p
, a
->expire_tokens
, i
)
794 unit_serialize_item_format(u
, f
, "expire-token", "%u", PTR_TO_UINT(p
));
796 r
= unit_serialize_item_fd(u
, f
, fds
, "pipe-fd", a
->pipe_fd
);
803 static int automount_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
804 Automount
*a
= AUTOMOUNT(u
);
810 if (streq(key
, "state")) {
811 AutomountState state
;
813 state
= automount_state_from_string(value
);
815 log_unit_debug(u
, "Failed to parse state value: %s", value
);
817 a
->deserialized_state
= state
;
818 } else if (streq(key
, "result")) {
821 f
= automount_result_from_string(value
);
823 log_unit_debug(u
, "Failed to parse result value: %s", value
);
824 else if (f
!= AUTOMOUNT_SUCCESS
)
827 } else if (streq(key
, "dev-id")) {
830 if (safe_atou(value
, &d
) < 0)
831 log_unit_debug(u
, "Failed to parse dev-id value: %s", value
);
833 a
->dev_id
= (unsigned) d
;
834 } else if (streq(key
, "token")) {
837 if (safe_atou(value
, &token
) < 0)
838 log_unit_debug(u
, "Failed to parse token value: %s", value
);
840 r
= set_ensure_allocated(&a
->tokens
, NULL
);
846 r
= set_put(a
->tokens
, UINT_TO_PTR(token
));
848 log_unit_error_errno(u
, r
, "Failed to add token to set: %m");
850 } else if (streq(key
, "expire-token")) {
853 if (safe_atou(value
, &token
) < 0)
854 log_unit_debug(u
, "Failed to parse token value: %s", value
);
856 r
= set_ensure_allocated(&a
->expire_tokens
, NULL
);
862 r
= set_put(a
->expire_tokens
, UINT_TO_PTR(token
));
864 log_unit_error_errno(u
, r
, "Failed to add expire token to set: %m");
866 } else if (streq(key
, "pipe-fd")) {
869 if (safe_atoi(value
, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
870 log_unit_debug(u
, "Failed to parse pipe-fd value: %s", value
);
872 safe_close(a
->pipe_fd
);
873 a
->pipe_fd
= fdset_remove(fds
, fd
);
876 log_unit_debug(u
, "Unknown serialization key: %s", key
);
881 static UnitActiveState
automount_active_state(Unit
*u
) {
884 return state_translation_table
[AUTOMOUNT(u
)->state
];
887 static const char *automount_sub_state_to_string(Unit
*u
) {
890 return automount_state_to_string(AUTOMOUNT(u
)->state
);
893 static bool automount_check_gc(Unit
*u
) {
896 if (!UNIT_TRIGGER(u
))
899 return UNIT_VTABLE(UNIT_TRIGGER(u
))->check_gc(UNIT_TRIGGER(u
));
902 static int automount_dispatch_io(sd_event_source
*s
, int fd
, uint32_t events
, void *userdata
) {
903 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
904 union autofs_v5_packet_union packet
;
905 Automount
*a
= AUTOMOUNT(userdata
);
910 assert(fd
== a
->pipe_fd
);
912 if (events
!= EPOLLIN
) {
913 log_unit_error(UNIT(a
), "Got invalid poll event %"PRIu32
" on pipe (fd=%d)", events
, fd
);
917 r
= loop_read_exact(a
->pipe_fd
, &packet
, sizeof(packet
), true);
919 log_unit_error_errno(UNIT(a
), r
, "Invalid read from pipe: %m");
923 switch (packet
.hdr
.type
) {
925 case autofs_ptype_missing_direct
:
927 if (packet
.v5_packet
.pid
> 0) {
928 _cleanup_free_
char *p
= NULL
;
930 get_process_comm(packet
.v5_packet
.pid
, &p
);
931 log_unit_info(UNIT(a
), "Got automount request for %s, triggered by %"PRIu32
" (%s)", a
->where
, packet
.v5_packet
.pid
, strna(p
));
933 log_unit_debug(UNIT(a
), "Got direct mount request on %s", a
->where
);
935 r
= set_ensure_allocated(&a
->tokens
, NULL
);
937 log_unit_error(UNIT(a
), "Failed to allocate token set.");
941 r
= set_put(a
->tokens
, UINT_TO_PTR(packet
.v5_packet
.wait_queue_token
));
943 log_unit_error_errno(UNIT(a
), r
, "Failed to remember token: %m");
947 automount_enter_runnning(a
);
950 case autofs_ptype_expire_direct
:
951 log_unit_debug(UNIT(a
), "Got direct umount request on %s", a
->where
);
953 (void) sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_OFF
);
955 r
= set_ensure_allocated(&a
->expire_tokens
, NULL
);
957 log_unit_error(UNIT(a
), "Failed to allocate token set.");
961 r
= set_put(a
->expire_tokens
, UINT_TO_PTR(packet
.v5_packet
.wait_queue_token
));
963 log_unit_error_errno(UNIT(a
), r
, "Failed to remember token: %m");
967 /* Before we do anything, let's see if somebody is playing games with us? */
968 if (lstat(a
->where
, &st
) < 0) {
969 log_unit_warning_errno(UNIT(a
), errno
, "Failed to stat automount point: %m");
973 if (!S_ISDIR(st
.st_mode
) || st
.st_dev
== a
->dev_id
) {
974 log_unit_info(UNIT(a
), "Automount point already unmounted?");
975 automount_send_ready(a
, a
->expire_tokens
, 0);
979 r
= manager_add_job(UNIT(a
)->manager
, JOB_STOP
, UNIT_TRIGGER(UNIT(a
)), JOB_REPLACE
, true, &error
, NULL
);
981 log_unit_warning(UNIT(a
), "Failed to queue umount startup job: %s", bus_error_message(&error
, r
));
987 log_unit_error(UNIT(a
), "Received unknown automount request %i", packet
.hdr
.type
);
994 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
998 static void automount_shutdown(Manager
*m
) {
1001 m
->dev_autofs_fd
= safe_close(m
->dev_autofs_fd
);
1004 static void automount_reset_failed(Unit
*u
) {
1005 Automount
*a
= AUTOMOUNT(u
);
1009 if (a
->state
== AUTOMOUNT_FAILED
)
1010 automount_set_state(a
, AUTOMOUNT_DEAD
);
1012 a
->result
= AUTOMOUNT_SUCCESS
;
1015 static bool automount_supported(void) {
1016 static int supported
= -1;
1019 supported
= access("/dev/autofs", F_OK
) >= 0;
1024 static const char* const automount_result_table
[_AUTOMOUNT_RESULT_MAX
] = {
1025 [AUTOMOUNT_SUCCESS
] = "success",
1026 [AUTOMOUNT_FAILURE_RESOURCES
] = "resources"
1029 DEFINE_STRING_TABLE_LOOKUP(automount_result
, AutomountResult
);
1031 const UnitVTable automount_vtable
= {
1032 .object_size
= sizeof(Automount
),
1040 .no_instances
= true,
1042 .init
= automount_init
,
1043 .load
= automount_load
,
1044 .done
= automount_done
,
1046 .coldplug
= automount_coldplug
,
1048 .dump
= automount_dump
,
1050 .start
= automount_start
,
1051 .stop
= automount_stop
,
1053 .serialize
= automount_serialize
,
1054 .deserialize_item
= automount_deserialize_item
,
1056 .active_state
= automount_active_state
,
1057 .sub_state_to_string
= automount_sub_state_to_string
,
1059 .check_gc
= automount_check_gc
,
1061 .reset_failed
= automount_reset_failed
,
1063 .bus_vtable
= bus_automount_vtable
,
1065 .shutdown
= automount_shutdown
,
1066 .supported
= automount_supported
,
1068 .status_message_formats
= {
1069 .finished_start_job
= {
1070 [JOB_DONE
] = "Set up automount %s.",
1071 [JOB_FAILED
] = "Failed to set up automount %s.",
1073 .finished_stop_job
= {
1074 [JOB_DONE
] = "Unset automount %s.",
1075 [JOB_FAILED
] = "Failed to unset automount %s.",