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 "mount-util.h"
44 #include "parse-util.h"
45 #include "path-util.h"
46 #include "process-util.h"
48 #include "string-table.h"
49 #include "string-util.h"
50 #include "unit-name.h"
53 static const UnitActiveState state_translation_table
[_AUTOMOUNT_STATE_MAX
] = {
54 [AUTOMOUNT_DEAD
] = UNIT_INACTIVE
,
55 [AUTOMOUNT_WAITING
] = UNIT_ACTIVE
,
56 [AUTOMOUNT_RUNNING
] = UNIT_ACTIVE
,
57 [AUTOMOUNT_FAILED
] = UNIT_FAILED
65 static inline void expire_data_free(struct expire_data
*data
) {
69 safe_close(data
->dev_autofs_fd
);
70 safe_close(data
->ioctl_fd
);
74 DEFINE_TRIVIAL_CLEANUP_FUNC(struct expire_data
*, expire_data_free
);
76 static int open_dev_autofs(Manager
*m
);
77 static int automount_dispatch_io(sd_event_source
*s
, int fd
, uint32_t events
, void *userdata
);
79 static void automount_init(Unit
*u
) {
80 Automount
*a
= AUTOMOUNT(u
);
83 assert(u
->load_state
== UNIT_STUB
);
86 a
->directory_mode
= 0755;
87 UNIT(a
)->ignore_on_isolate
= true;
90 static void repeat_unmount(const char *path
) {
94 /* If there are multiple mounts on a mount point, this
97 if (umount2(path
, MNT_DETACH
) >= 0)
101 log_error_errno(errno
, "Failed to unmount: %m");
107 static int automount_send_ready(Automount
*a
, Set
*tokens
, int status
);
109 static void unmount_autofs(Automount
*a
) {
115 automount_send_ready(a
, a
->tokens
, -EHOSTDOWN
);
116 automount_send_ready(a
, a
->expire_tokens
, -EHOSTDOWN
);
118 a
->pipe_event_source
= sd_event_source_unref(a
->pipe_event_source
);
119 a
->pipe_fd
= safe_close(a
->pipe_fd
);
121 /* If we reload/reexecute things we keep the mount point
124 (UNIT(a
)->manager
->exit_code
!= MANAGER_RELOAD
&&
125 UNIT(a
)->manager
->exit_code
!= MANAGER_REEXECUTE
))
126 repeat_unmount(a
->where
);
129 static void automount_done(Unit
*u
) {
130 Automount
*a
= AUTOMOUNT(u
);
136 a
->where
= mfree(a
->where
);
138 a
->tokens
= set_free(a
->tokens
);
139 a
->expire_tokens
= set_free(a
->expire_tokens
);
141 a
->expire_event_source
= sd_event_source_unref(a
->expire_event_source
);
144 static int automount_add_mount_links(Automount
*a
) {
145 _cleanup_free_
char *parent
= NULL
;
149 parent
= dirname_malloc(a
->where
);
153 return unit_require_mounts_for(UNIT(a
), parent
);
156 static int automount_add_default_dependencies(Automount
*a
) {
161 if (UNIT(a
)->manager
->running_as
!= MANAGER_SYSTEM
)
164 r
= unit_add_two_dependencies_by_name(UNIT(a
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
171 static int automount_verify(Automount
*a
) {
172 _cleanup_free_
char *e
= NULL
;
177 if (UNIT(a
)->load_state
!= UNIT_LOADED
)
180 if (path_equal(a
->where
, "/")) {
181 log_unit_error(UNIT(a
), "Cannot have an automount unit for the root directory. Refusing.");
185 r
= unit_name_from_path(a
->where
, ".automount", &e
);
187 return log_unit_error(UNIT(a
), "Failed to generate unit name from path: %m");
189 if (!unit_has_name(UNIT(a
), e
)) {
190 log_unit_error(UNIT(a
), "Where= setting doesn't match unit name. Refusing.");
197 static int automount_load(Unit
*u
) {
198 Automount
*a
= AUTOMOUNT(u
);
202 assert(u
->load_state
== UNIT_STUB
);
204 /* Load a .automount file */
205 r
= unit_load_fragment_and_dropin_optional(u
);
209 if (u
->load_state
== UNIT_LOADED
) {
213 r
= unit_name_to_path(u
->id
, &a
->where
);
218 path_kill_slashes(a
->where
);
220 r
= unit_load_related_unit(u
, ".mount", &x
);
224 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, x
, true);
228 r
= automount_add_mount_links(a
);
232 if (UNIT(a
)->default_dependencies
) {
233 r
= automount_add_default_dependencies(a
);
239 return automount_verify(a
);
242 static void automount_set_state(Automount
*a
, AutomountState state
) {
243 AutomountState old_state
;
246 old_state
= a
->state
;
249 if (state
!= AUTOMOUNT_WAITING
&&
250 state
!= AUTOMOUNT_RUNNING
)
253 if (state
!= old_state
)
254 log_unit_debug(UNIT(a
), "Changed %s -> %s", automount_state_to_string(old_state
), automount_state_to_string(state
));
256 unit_notify(UNIT(a
), state_translation_table
[old_state
], state_translation_table
[state
], true);
259 static int automount_coldplug(Unit
*u
) {
260 Automount
*a
= AUTOMOUNT(u
);
264 assert(a
->state
== AUTOMOUNT_DEAD
);
266 if (a
->deserialized_state
!= a
->state
) {
268 r
= open_dev_autofs(u
->manager
);
272 if (a
->deserialized_state
== AUTOMOUNT_WAITING
||
273 a
->deserialized_state
== AUTOMOUNT_RUNNING
) {
274 assert(a
->pipe_fd
>= 0);
276 r
= sd_event_add_io(u
->manager
->event
, &a
->pipe_event_source
, a
->pipe_fd
, EPOLLIN
, automount_dispatch_io
, u
);
280 (void) sd_event_source_set_description(a
->pipe_event_source
, "automount-io");
283 automount_set_state(a
, a
->deserialized_state
);
289 static void automount_dump(Unit
*u
, FILE *f
, const char *prefix
) {
290 char time_string
[FORMAT_TIMESPAN_MAX
];
291 Automount
*a
= AUTOMOUNT(u
);
296 "%sAutomount State: %s\n"
299 "%sDirectoryMode: %04o\n"
300 "%sTimeoutIdleUSec: %s\n",
301 prefix
, automount_state_to_string(a
->state
),
302 prefix
, automount_result_to_string(a
->result
),
304 prefix
, a
->directory_mode
,
305 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, a
->timeout_idle_usec
, USEC_PER_SEC
));
308 static void automount_enter_dead(Automount
*a
, AutomountResult f
) {
311 if (f
!= AUTOMOUNT_SUCCESS
)
314 automount_set_state(a
, a
->result
!= AUTOMOUNT_SUCCESS
? AUTOMOUNT_FAILED
: AUTOMOUNT_DEAD
);
317 static int open_dev_autofs(Manager
*m
) {
318 struct autofs_dev_ioctl param
;
322 if (m
->dev_autofs_fd
>= 0)
323 return m
->dev_autofs_fd
;
325 label_fix("/dev/autofs", false, false);
327 m
->dev_autofs_fd
= open("/dev/autofs", O_CLOEXEC
|O_RDONLY
);
328 if (m
->dev_autofs_fd
< 0)
329 return log_error_errno(errno
, "Failed to open /dev/autofs: %m");
331 init_autofs_dev_ioctl(¶m
);
332 if (ioctl(m
->dev_autofs_fd
, AUTOFS_DEV_IOCTL_VERSION
, ¶m
) < 0) {
333 m
->dev_autofs_fd
= safe_close(m
->dev_autofs_fd
);
337 log_debug("Autofs kernel version %i.%i", param
.ver_major
, param
.ver_minor
);
339 return m
->dev_autofs_fd
;
342 static int open_ioctl_fd(int dev_autofs_fd
, const char *where
, dev_t devid
) {
343 struct autofs_dev_ioctl
*param
;
346 assert(dev_autofs_fd
>= 0);
349 l
= sizeof(struct autofs_dev_ioctl
) + strlen(where
) + 1;
352 init_autofs_dev_ioctl(param
);
355 param
->openmount
.devid
= devid
;
356 strcpy(param
->path
, where
);
358 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_OPENMOUNT
, param
) < 0)
361 if (param
->ioctlfd
< 0)
364 (void) fd_cloexec(param
->ioctlfd
, true);
365 return param
->ioctlfd
;
368 static int autofs_protocol(int dev_autofs_fd
, int ioctl_fd
) {
369 uint32_t major
, minor
;
370 struct autofs_dev_ioctl param
;
372 assert(dev_autofs_fd
>= 0);
373 assert(ioctl_fd
>= 0);
375 init_autofs_dev_ioctl(¶m
);
376 param
.ioctlfd
= ioctl_fd
;
378 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_PROTOVER
, ¶m
) < 0)
381 major
= param
.protover
.version
;
383 init_autofs_dev_ioctl(¶m
);
384 param
.ioctlfd
= ioctl_fd
;
386 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_PROTOSUBVER
, ¶m
) < 0)
389 minor
= param
.protosubver
.sub_version
;
391 log_debug("Autofs protocol version %i.%i", major
, minor
);
395 static int autofs_set_timeout(int dev_autofs_fd
, int ioctl_fd
, usec_t usec
) {
396 struct autofs_dev_ioctl param
;
398 assert(dev_autofs_fd
>= 0);
399 assert(ioctl_fd
>= 0);
401 init_autofs_dev_ioctl(¶m
);
402 param
.ioctlfd
= ioctl_fd
;
404 /* Convert to seconds, rounding up. */
405 param
.timeout
.timeout
= (usec
+ USEC_PER_SEC
- 1) / USEC_PER_SEC
;
407 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_TIMEOUT
, ¶m
) < 0)
413 static int autofs_send_ready(int dev_autofs_fd
, int ioctl_fd
, uint32_t token
, int status
) {
414 struct autofs_dev_ioctl param
;
416 assert(dev_autofs_fd
>= 0);
417 assert(ioctl_fd
>= 0);
419 init_autofs_dev_ioctl(¶m
);
420 param
.ioctlfd
= ioctl_fd
;
423 param
.fail
.token
= token
;
424 param
.fail
.status
= status
;
426 param
.ready
.token
= token
;
428 if (ioctl(dev_autofs_fd
, status
? AUTOFS_DEV_IOCTL_FAIL
: AUTOFS_DEV_IOCTL_READY
, ¶m
) < 0)
434 static int automount_send_ready(Automount
*a
, Set
*tokens
, int status
) {
435 _cleanup_close_
int ioctl_fd
= -1;
442 if (set_isempty(tokens
))
445 ioctl_fd
= open_ioctl_fd(UNIT(a
)->manager
->dev_autofs_fd
, a
->where
, a
->dev_id
);
450 log_unit_debug_errno(UNIT(a
), status
, "Sending failure: %m");
452 log_unit_debug(UNIT(a
), "Sending success.");
456 /* Autofs thankfully does not hand out 0 as a token */
457 while ((token
= PTR_TO_UINT(set_steal_first(tokens
)))) {
460 /* Autofs fun fact II:
462 * if you pass a positive status code here, the kernel will
465 k
= autofs_send_ready(UNIT(a
)->manager
->dev_autofs_fd
,
476 static int automount_start_expire(Automount
*a
);
478 int automount_update_mount(Automount
*a
, MountState old_state
, MountState state
) {
485 case MOUNT_REMOUNTING
:
486 automount_send_ready(a
, a
->tokens
, 0);
487 r
= automount_start_expire(a
);
489 log_unit_warning_errno(UNIT(a
), r
, "Failed to start expiration timer, ignoring: %m");
492 case MOUNT_UNMOUNTING
:
493 case MOUNT_MOUNTING_SIGTERM
:
494 case MOUNT_MOUNTING_SIGKILL
:
495 case MOUNT_REMOUNTING_SIGTERM
:
496 case MOUNT_REMOUNTING_SIGKILL
:
497 case MOUNT_UNMOUNTING_SIGTERM
:
498 case MOUNT_UNMOUNTING_SIGKILL
:
500 if (old_state
!= state
)
501 automount_send_ready(a
, a
->tokens
, -ENODEV
);
502 (void) sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_OFF
);
510 automount_send_ready(a
, a
->expire_tokens
, 0);
513 case MOUNT_MOUNTING_DONE
:
514 case MOUNT_MOUNTING_SIGTERM
:
515 case MOUNT_MOUNTING_SIGKILL
:
516 case MOUNT_REMOUNTING_SIGTERM
:
517 case MOUNT_REMOUNTING_SIGKILL
:
518 case MOUNT_UNMOUNTING_SIGTERM
:
519 case MOUNT_UNMOUNTING_SIGKILL
:
521 if (old_state
!= state
)
522 automount_send_ready(a
, a
->expire_tokens
, -ENODEV
);
531 static void automount_enter_waiting(Automount
*a
) {
532 _cleanup_close_
int ioctl_fd
= -1;
533 int p
[2] = { -1, -1 };
534 char name
[sizeof("systemd-")-1 + DECIMAL_STR_MAX(pid_t
) + 1];
535 char options
[sizeof("fd=,pgrp=,minproto=5,maxproto=5,direct")-1
536 + DECIMAL_STR_MAX(int) + DECIMAL_STR_MAX(gid_t
) + 1];
537 bool mounted
= false;
538 int r
, dev_autofs_fd
;
542 assert(a
->pipe_fd
< 0);
545 set_clear(a
->tokens
);
547 r
= unit_fail_if_symlink(UNIT(a
), a
->where
);
551 (void) mkdir_p_label(a
->where
, 0555);
553 unit_warn_if_dir_nonempty(UNIT(a
), a
->where
);
555 dev_autofs_fd
= open_dev_autofs(UNIT(a
)->manager
);
556 if (dev_autofs_fd
< 0) {
561 if (pipe2(p
, O_NONBLOCK
|O_CLOEXEC
) < 0) {
566 xsprintf(options
, "fd=%i,pgrp="PID_FMT
",minproto=5,maxproto=5,direct", p
[1], getpgrp());
567 xsprintf(name
, "systemd-"PID_FMT
, getpid());
568 if (mount(name
, a
->where
, "autofs", 0, options
) < 0) {
575 p
[1] = safe_close(p
[1]);
577 if (stat(a
->where
, &st
) < 0) {
582 ioctl_fd
= open_ioctl_fd(dev_autofs_fd
, a
->where
, st
.st_dev
);
588 r
= autofs_protocol(dev_autofs_fd
, ioctl_fd
);
592 r
= autofs_set_timeout(dev_autofs_fd
, ioctl_fd
, a
->timeout_idle_usec
);
598 * Unless we close the ioctl fd here, for some weird reason
599 * the direct mount will not receive events from the
602 r
= sd_event_add_io(UNIT(a
)->manager
->event
, &a
->pipe_event_source
, p
[0], EPOLLIN
, automount_dispatch_io
, a
);
606 (void) sd_event_source_set_description(a
->pipe_event_source
, "automount-io");
609 a
->dev_id
= st
.st_dev
;
611 automount_set_state(a
, AUTOMOUNT_WAITING
);
619 repeat_unmount(a
->where
);
621 log_unit_error_errno(UNIT(a
), r
, "Failed to initialize automounter: %m");
622 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
625 static void *expire_thread(void *p
) {
626 struct autofs_dev_ioctl param
;
627 _cleanup_(expire_data_freep
) struct expire_data
*data
= (struct expire_data
*)p
;
630 assert(data
->dev_autofs_fd
>= 0);
631 assert(data
->ioctl_fd
>= 0);
633 init_autofs_dev_ioctl(¶m
);
634 param
.ioctlfd
= data
->ioctl_fd
;
637 r
= ioctl(data
->dev_autofs_fd
, AUTOFS_DEV_IOCTL_EXPIRE
, ¶m
);
641 log_warning_errno(errno
, "Failed to expire automount, ignoring: %m");
646 static int automount_dispatch_expire(sd_event_source
*source
, usec_t usec
, void *userdata
) {
647 Automount
*a
= AUTOMOUNT(userdata
);
648 _cleanup_(expire_data_freep
) struct expire_data
*data
= NULL
;
652 assert(source
== a
->expire_event_source
);
654 data
= new0(struct expire_data
, 1);
660 data
->dev_autofs_fd
= fcntl(UNIT(a
)->manager
->dev_autofs_fd
, F_DUPFD_CLOEXEC
, 3);
661 if (data
->dev_autofs_fd
< 0)
662 return log_unit_error_errno(UNIT(a
), errno
, "Failed to duplicate autofs fd: %m");
664 data
->ioctl_fd
= open_ioctl_fd(UNIT(a
)->manager
->dev_autofs_fd
, a
->where
, a
->dev_id
);
665 if (data
->ioctl_fd
< 0)
666 return log_unit_error_errno(UNIT(a
), data
->ioctl_fd
, "Couldn't open autofs ioctl fd: %m");
668 r
= asynchronous_job(expire_thread
, data
);
670 return log_unit_error_errno(UNIT(a
), r
, "Failed to start expire job: %m");
674 return automount_start_expire(a
);
677 static int automount_start_expire(Automount
*a
) {
683 if (a
->timeout_idle_usec
== 0)
686 timeout
= now(CLOCK_MONOTONIC
) + MAX(a
->timeout_idle_usec
/3, USEC_PER_SEC
);
688 if (a
->expire_event_source
) {
689 r
= sd_event_source_set_time(a
->expire_event_source
, timeout
);
693 return sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_ONESHOT
);
696 r
= sd_event_add_time(
697 UNIT(a
)->manager
->event
,
698 &a
->expire_event_source
,
699 CLOCK_MONOTONIC
, timeout
, 0,
700 automount_dispatch_expire
, a
);
704 (void) sd_event_source_set_description(a
->expire_event_source
, "automount-expire");
709 static void automount_enter_runnning(Automount
*a
) {
710 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
716 /* We don't take mount requests anymore if we are supposed to
717 * shut down anyway */
718 if (unit_stop_pending(UNIT(a
))) {
719 log_unit_debug(UNIT(a
), "Suppressing automount request since unit stop is scheduled.");
720 automount_send_ready(a
, a
->tokens
, -EHOSTDOWN
);
721 automount_send_ready(a
, a
->expire_tokens
, -EHOSTDOWN
);
725 mkdir_p_label(a
->where
, a
->directory_mode
);
727 /* Before we do anything, let's see if somebody is playing games with us? */
728 if (lstat(a
->where
, &st
) < 0) {
729 log_unit_warning_errno(UNIT(a
), errno
, "Failed to stat automount point: %m");
733 if (!S_ISDIR(st
.st_mode
) || st
.st_dev
!= a
->dev_id
)
734 log_unit_info(UNIT(a
), "Automount point already active?");
736 r
= manager_add_job(UNIT(a
)->manager
, JOB_START
, UNIT_TRIGGER(UNIT(a
)),
737 JOB_REPLACE
, true, &error
, NULL
);
739 log_unit_warning(UNIT(a
), "Failed to queue mount startup job: %s", bus_error_message(&error
, r
));
744 automount_set_state(a
, AUTOMOUNT_RUNNING
);
748 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
751 static int automount_start(Unit
*u
) {
752 Automount
*a
= AUTOMOUNT(u
);
755 assert(a
->state
== AUTOMOUNT_DEAD
|| a
->state
== AUTOMOUNT_FAILED
);
757 if (path_is_mount_point(a
->where
, 0) > 0) {
758 log_unit_error(u
, "Path %s is already a mount point, refusing start.", a
->where
);
762 if (UNIT_TRIGGER(u
)->load_state
!= UNIT_LOADED
)
765 a
->result
= AUTOMOUNT_SUCCESS
;
766 automount_enter_waiting(a
);
770 static int automount_stop(Unit
*u
) {
771 Automount
*a
= AUTOMOUNT(u
);
774 assert(a
->state
== AUTOMOUNT_WAITING
|| a
->state
== AUTOMOUNT_RUNNING
);
776 automount_enter_dead(a
, AUTOMOUNT_SUCCESS
);
780 static int automount_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
781 Automount
*a
= AUTOMOUNT(u
);
790 unit_serialize_item(u
, f
, "state", automount_state_to_string(a
->state
));
791 unit_serialize_item(u
, f
, "result", automount_result_to_string(a
->result
));
792 unit_serialize_item_format(u
, f
, "dev-id", "%u", (unsigned) a
->dev_id
);
794 SET_FOREACH(p
, a
->tokens
, i
)
795 unit_serialize_item_format(u
, f
, "token", "%u", PTR_TO_UINT(p
));
796 SET_FOREACH(p
, a
->expire_tokens
, i
)
797 unit_serialize_item_format(u
, f
, "expire-token", "%u", PTR_TO_UINT(p
));
799 r
= unit_serialize_item_fd(u
, f
, fds
, "pipe-fd", a
->pipe_fd
);
806 static int automount_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
807 Automount
*a
= AUTOMOUNT(u
);
813 if (streq(key
, "state")) {
814 AutomountState state
;
816 state
= automount_state_from_string(value
);
818 log_unit_debug(u
, "Failed to parse state value: %s", value
);
820 a
->deserialized_state
= state
;
821 } else if (streq(key
, "result")) {
824 f
= automount_result_from_string(value
);
826 log_unit_debug(u
, "Failed to parse result value: %s", value
);
827 else if (f
!= AUTOMOUNT_SUCCESS
)
830 } else if (streq(key
, "dev-id")) {
833 if (safe_atou(value
, &d
) < 0)
834 log_unit_debug(u
, "Failed to parse dev-id value: %s", value
);
836 a
->dev_id
= (unsigned) d
;
837 } else if (streq(key
, "token")) {
840 if (safe_atou(value
, &token
) < 0)
841 log_unit_debug(u
, "Failed to parse token value: %s", value
);
843 r
= set_ensure_allocated(&a
->tokens
, NULL
);
849 r
= set_put(a
->tokens
, UINT_TO_PTR(token
));
851 log_unit_error_errno(u
, r
, "Failed to add token to set: %m");
853 } else if (streq(key
, "expire-token")) {
856 if (safe_atou(value
, &token
) < 0)
857 log_unit_debug(u
, "Failed to parse token value: %s", value
);
859 r
= set_ensure_allocated(&a
->expire_tokens
, NULL
);
865 r
= set_put(a
->expire_tokens
, UINT_TO_PTR(token
));
867 log_unit_error_errno(u
, r
, "Failed to add expire token to set: %m");
869 } else if (streq(key
, "pipe-fd")) {
872 if (safe_atoi(value
, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
873 log_unit_debug(u
, "Failed to parse pipe-fd value: %s", value
);
875 safe_close(a
->pipe_fd
);
876 a
->pipe_fd
= fdset_remove(fds
, fd
);
879 log_unit_debug(u
, "Unknown serialization key: %s", key
);
884 static UnitActiveState
automount_active_state(Unit
*u
) {
887 return state_translation_table
[AUTOMOUNT(u
)->state
];
890 static const char *automount_sub_state_to_string(Unit
*u
) {
893 return automount_state_to_string(AUTOMOUNT(u
)->state
);
896 static bool automount_check_gc(Unit
*u
) {
899 if (!UNIT_TRIGGER(u
))
902 return UNIT_VTABLE(UNIT_TRIGGER(u
))->check_gc(UNIT_TRIGGER(u
));
905 static int automount_dispatch_io(sd_event_source
*s
, int fd
, uint32_t events
, void *userdata
) {
906 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
907 union autofs_v5_packet_union packet
;
908 Automount
*a
= AUTOMOUNT(userdata
);
913 assert(fd
== a
->pipe_fd
);
915 if (events
!= EPOLLIN
) {
916 log_unit_error(UNIT(a
), "Got invalid poll event %"PRIu32
" on pipe (fd=%d)", events
, fd
);
920 r
= loop_read_exact(a
->pipe_fd
, &packet
, sizeof(packet
), true);
922 log_unit_error_errno(UNIT(a
), r
, "Invalid read from pipe: %m");
926 switch (packet
.hdr
.type
) {
928 case autofs_ptype_missing_direct
:
930 if (packet
.v5_packet
.pid
> 0) {
931 _cleanup_free_
char *p
= NULL
;
933 get_process_comm(packet
.v5_packet
.pid
, &p
);
934 log_unit_info(UNIT(a
), "Got automount request for %s, triggered by %"PRIu32
" (%s)", a
->where
, packet
.v5_packet
.pid
, strna(p
));
936 log_unit_debug(UNIT(a
), "Got direct mount request on %s", a
->where
);
938 r
= set_ensure_allocated(&a
->tokens
, NULL
);
940 log_unit_error(UNIT(a
), "Failed to allocate token set.");
944 r
= set_put(a
->tokens
, UINT_TO_PTR(packet
.v5_packet
.wait_queue_token
));
946 log_unit_error_errno(UNIT(a
), r
, "Failed to remember token: %m");
950 automount_enter_runnning(a
);
953 case autofs_ptype_expire_direct
:
954 log_unit_debug(UNIT(a
), "Got direct umount request on %s", a
->where
);
956 (void) sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_OFF
);
958 r
= set_ensure_allocated(&a
->expire_tokens
, NULL
);
960 log_unit_error(UNIT(a
), "Failed to allocate token set.");
964 r
= set_put(a
->expire_tokens
, UINT_TO_PTR(packet
.v5_packet
.wait_queue_token
));
966 log_unit_error_errno(UNIT(a
), r
, "Failed to remember token: %m");
970 /* Before we do anything, let's see if somebody is playing games with us? */
971 if (lstat(a
->where
, &st
) < 0) {
972 log_unit_warning_errno(UNIT(a
), errno
, "Failed to stat automount point: %m");
976 if (!S_ISDIR(st
.st_mode
) || st
.st_dev
== a
->dev_id
) {
977 log_unit_info(UNIT(a
), "Automount point already unmounted?");
978 automount_send_ready(a
, a
->expire_tokens
, 0);
982 r
= manager_add_job(UNIT(a
)->manager
, JOB_STOP
, UNIT_TRIGGER(UNIT(a
)), JOB_REPLACE
, true, &error
, NULL
);
984 log_unit_warning(UNIT(a
), "Failed to queue umount startup job: %s", bus_error_message(&error
, r
));
990 log_unit_error(UNIT(a
), "Received unknown automount request %i", packet
.hdr
.type
);
997 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
1001 static void automount_shutdown(Manager
*m
) {
1004 m
->dev_autofs_fd
= safe_close(m
->dev_autofs_fd
);
1007 static void automount_reset_failed(Unit
*u
) {
1008 Automount
*a
= AUTOMOUNT(u
);
1012 if (a
->state
== AUTOMOUNT_FAILED
)
1013 automount_set_state(a
, AUTOMOUNT_DEAD
);
1015 a
->result
= AUTOMOUNT_SUCCESS
;
1018 static bool automount_supported(void) {
1019 static int supported
= -1;
1022 supported
= access("/dev/autofs", F_OK
) >= 0;
1027 static const char* const automount_result_table
[_AUTOMOUNT_RESULT_MAX
] = {
1028 [AUTOMOUNT_SUCCESS
] = "success",
1029 [AUTOMOUNT_FAILURE_RESOURCES
] = "resources"
1032 DEFINE_STRING_TABLE_LOOKUP(automount_result
, AutomountResult
);
1034 const UnitVTable automount_vtable
= {
1035 .object_size
= sizeof(Automount
),
1043 .no_instances
= true,
1045 .init
= automount_init
,
1046 .load
= automount_load
,
1047 .done
= automount_done
,
1049 .coldplug
= automount_coldplug
,
1051 .dump
= automount_dump
,
1053 .start
= automount_start
,
1054 .stop
= automount_stop
,
1056 .serialize
= automount_serialize
,
1057 .deserialize_item
= automount_deserialize_item
,
1059 .active_state
= automount_active_state
,
1060 .sub_state_to_string
= automount_sub_state_to_string
,
1062 .check_gc
= automount_check_gc
,
1064 .reset_failed
= automount_reset_failed
,
1066 .bus_vtable
= bus_automount_vtable
,
1068 .shutdown
= automount_shutdown
,
1069 .supported
= automount_supported
,
1071 .status_message_formats
= {
1072 .finished_start_job
= {
1073 [JOB_DONE
] = "Set up automount %s.",
1074 [JOB_FAILED
] = "Failed to set up automount %s.",
1076 .finished_stop_job
= {
1077 [JOB_DONE
] = "Unset automount %s.",
1078 [JOB_FAILED
] = "Failed to unset automount %s.",