2 This file is part of systemd.
4 Copyright 2010 Lennart Poettering
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23 #include <linux/auto_dev-ioctl.h>
24 #include <linux/auto_fs4.h>
25 #include <sys/epoll.h>
26 #include <sys/mount.h>
30 #include "alloc-util.h"
32 #include "automount.h"
33 #include "bus-error.h"
35 #include "dbus-automount.h"
37 #include "formats-util.h"
41 #include "mount-util.h"
43 #include "parse-util.h"
44 #include "path-util.h"
45 #include "process-util.h"
47 #include "stdio-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 int automount_send_ready(Automount
*a
, Set
*tokens
, int status
);
92 static void unmount_autofs(Automount
*a
) {
100 automount_send_ready(a
, a
->tokens
, -EHOSTDOWN
);
101 automount_send_ready(a
, a
->expire_tokens
, -EHOSTDOWN
);
103 a
->pipe_event_source
= sd_event_source_unref(a
->pipe_event_source
);
104 a
->pipe_fd
= safe_close(a
->pipe_fd
);
106 /* If we reload/reexecute things we keep the mount point
109 (UNIT(a
)->manager
->exit_code
!= MANAGER_RELOAD
&&
110 UNIT(a
)->manager
->exit_code
!= MANAGER_REEXECUTE
)) {
111 r
= repeat_unmount(a
->where
, MNT_DETACH
);
113 log_error_errno(r
, "Failed to unmount: %m");
117 static void automount_done(Unit
*u
) {
118 Automount
*a
= AUTOMOUNT(u
);
124 a
->where
= mfree(a
->where
);
126 a
->tokens
= set_free(a
->tokens
);
127 a
->expire_tokens
= set_free(a
->expire_tokens
);
129 a
->expire_event_source
= sd_event_source_unref(a
->expire_event_source
);
132 static int automount_add_mount_links(Automount
*a
) {
133 _cleanup_free_
char *parent
= NULL
;
137 parent
= dirname_malloc(a
->where
);
141 return unit_require_mounts_for(UNIT(a
), parent
);
144 static int automount_add_default_dependencies(Automount
*a
) {
149 if (!UNIT(a
)->default_dependencies
)
152 if (UNIT(a
)->manager
->running_as
!= MANAGER_SYSTEM
)
155 r
= unit_add_two_dependencies_by_name(UNIT(a
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
162 static int automount_verify(Automount
*a
) {
163 _cleanup_free_
char *e
= NULL
;
168 if (UNIT(a
)->load_state
!= UNIT_LOADED
)
171 if (path_equal(a
->where
, "/")) {
172 log_unit_error(UNIT(a
), "Cannot have an automount unit for the root directory. Refusing.");
176 r
= unit_name_from_path(a
->where
, ".automount", &e
);
178 return log_unit_error(UNIT(a
), "Failed to generate unit name from path: %m");
180 if (!unit_has_name(UNIT(a
), e
)) {
181 log_unit_error(UNIT(a
), "Where= setting doesn't match unit name. Refusing.");
188 static int automount_load(Unit
*u
) {
189 Automount
*a
= AUTOMOUNT(u
);
193 assert(u
->load_state
== UNIT_STUB
);
195 /* Load a .automount file */
196 r
= unit_load_fragment_and_dropin_optional(u
);
200 if (u
->load_state
== UNIT_LOADED
) {
204 r
= unit_name_to_path(u
->id
, &a
->where
);
209 path_kill_slashes(a
->where
);
211 r
= unit_load_related_unit(u
, ".mount", &x
);
215 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, x
, true);
219 r
= automount_add_mount_links(a
);
223 r
= automount_add_default_dependencies(a
);
228 return automount_verify(a
);
231 static void automount_set_state(Automount
*a
, AutomountState state
) {
232 AutomountState old_state
;
235 old_state
= a
->state
;
238 if (state
!= AUTOMOUNT_WAITING
&&
239 state
!= AUTOMOUNT_RUNNING
)
242 if (state
!= old_state
)
243 log_unit_debug(UNIT(a
), "Changed %s -> %s", automount_state_to_string(old_state
), automount_state_to_string(state
));
245 unit_notify(UNIT(a
), state_translation_table
[old_state
], state_translation_table
[state
], true);
248 static int automount_coldplug(Unit
*u
) {
249 Automount
*a
= AUTOMOUNT(u
);
253 assert(a
->state
== AUTOMOUNT_DEAD
);
255 if (a
->deserialized_state
!= a
->state
) {
257 r
= open_dev_autofs(u
->manager
);
261 if (a
->deserialized_state
== AUTOMOUNT_WAITING
||
262 a
->deserialized_state
== AUTOMOUNT_RUNNING
) {
263 assert(a
->pipe_fd
>= 0);
265 r
= sd_event_add_io(u
->manager
->event
, &a
->pipe_event_source
, a
->pipe_fd
, EPOLLIN
, automount_dispatch_io
, u
);
269 (void) sd_event_source_set_description(a
->pipe_event_source
, "automount-io");
272 automount_set_state(a
, a
->deserialized_state
);
278 static void automount_dump(Unit
*u
, FILE *f
, const char *prefix
) {
279 char time_string
[FORMAT_TIMESPAN_MAX
];
280 Automount
*a
= AUTOMOUNT(u
);
285 "%sAutomount State: %s\n"
288 "%sDirectoryMode: %04o\n"
289 "%sTimeoutIdleUSec: %s\n",
290 prefix
, automount_state_to_string(a
->state
),
291 prefix
, automount_result_to_string(a
->result
),
293 prefix
, a
->directory_mode
,
294 prefix
, format_timespan(time_string
, FORMAT_TIMESPAN_MAX
, a
->timeout_idle_usec
, USEC_PER_SEC
));
297 static void automount_enter_dead(Automount
*a
, AutomountResult f
) {
300 if (f
!= AUTOMOUNT_SUCCESS
)
303 automount_set_state(a
, a
->result
!= AUTOMOUNT_SUCCESS
? AUTOMOUNT_FAILED
: AUTOMOUNT_DEAD
);
306 static int open_dev_autofs(Manager
*m
) {
307 struct autofs_dev_ioctl param
;
311 if (m
->dev_autofs_fd
>= 0)
312 return m
->dev_autofs_fd
;
314 label_fix("/dev/autofs", false, false);
316 m
->dev_autofs_fd
= open("/dev/autofs", O_CLOEXEC
|O_RDONLY
);
317 if (m
->dev_autofs_fd
< 0)
318 return log_error_errno(errno
, "Failed to open /dev/autofs: %m");
320 init_autofs_dev_ioctl(¶m
);
321 if (ioctl(m
->dev_autofs_fd
, AUTOFS_DEV_IOCTL_VERSION
, ¶m
) < 0) {
322 m
->dev_autofs_fd
= safe_close(m
->dev_autofs_fd
);
326 log_debug("Autofs kernel version %i.%i", param
.ver_major
, param
.ver_minor
);
328 return m
->dev_autofs_fd
;
331 static int open_ioctl_fd(int dev_autofs_fd
, const char *where
, dev_t devid
) {
332 struct autofs_dev_ioctl
*param
;
335 assert(dev_autofs_fd
>= 0);
338 l
= sizeof(struct autofs_dev_ioctl
) + strlen(where
) + 1;
341 init_autofs_dev_ioctl(param
);
344 param
->openmount
.devid
= devid
;
345 strcpy(param
->path
, where
);
347 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_OPENMOUNT
, param
) < 0)
350 if (param
->ioctlfd
< 0)
353 (void) fd_cloexec(param
->ioctlfd
, true);
354 return param
->ioctlfd
;
357 static int autofs_protocol(int dev_autofs_fd
, int ioctl_fd
) {
358 uint32_t major
, minor
;
359 struct autofs_dev_ioctl param
;
361 assert(dev_autofs_fd
>= 0);
362 assert(ioctl_fd
>= 0);
364 init_autofs_dev_ioctl(¶m
);
365 param
.ioctlfd
= ioctl_fd
;
367 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_PROTOVER
, ¶m
) < 0)
370 major
= param
.protover
.version
;
372 init_autofs_dev_ioctl(¶m
);
373 param
.ioctlfd
= ioctl_fd
;
375 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_PROTOSUBVER
, ¶m
) < 0)
378 minor
= param
.protosubver
.sub_version
;
380 log_debug("Autofs protocol version %i.%i", major
, minor
);
384 static int autofs_set_timeout(int dev_autofs_fd
, int ioctl_fd
, usec_t usec
) {
385 struct autofs_dev_ioctl param
;
387 assert(dev_autofs_fd
>= 0);
388 assert(ioctl_fd
>= 0);
390 init_autofs_dev_ioctl(¶m
);
391 param
.ioctlfd
= ioctl_fd
;
393 /* Convert to seconds, rounding up. */
394 param
.timeout
.timeout
= (usec
+ USEC_PER_SEC
- 1) / USEC_PER_SEC
;
396 if (ioctl(dev_autofs_fd
, AUTOFS_DEV_IOCTL_TIMEOUT
, ¶m
) < 0)
402 static int autofs_send_ready(int dev_autofs_fd
, int ioctl_fd
, uint32_t token
, int status
) {
403 struct autofs_dev_ioctl param
;
405 assert(dev_autofs_fd
>= 0);
406 assert(ioctl_fd
>= 0);
408 init_autofs_dev_ioctl(¶m
);
409 param
.ioctlfd
= ioctl_fd
;
412 param
.fail
.token
= token
;
413 param
.fail
.status
= status
;
415 param
.ready
.token
= token
;
417 if (ioctl(dev_autofs_fd
, status
? AUTOFS_DEV_IOCTL_FAIL
: AUTOFS_DEV_IOCTL_READY
, ¶m
) < 0)
423 static int automount_send_ready(Automount
*a
, Set
*tokens
, int status
) {
424 _cleanup_close_
int ioctl_fd
= -1;
431 if (set_isempty(tokens
))
434 ioctl_fd
= open_ioctl_fd(UNIT(a
)->manager
->dev_autofs_fd
, a
->where
, a
->dev_id
);
439 log_unit_debug_errno(UNIT(a
), status
, "Sending failure: %m");
441 log_unit_debug(UNIT(a
), "Sending success.");
445 /* Autofs thankfully does not hand out 0 as a token */
446 while ((token
= PTR_TO_UINT(set_steal_first(tokens
)))) {
449 /* Autofs fun fact II:
451 * if you pass a positive status code here, the kernel will
454 k
= autofs_send_ready(UNIT(a
)->manager
->dev_autofs_fd
,
465 static int automount_start_expire(Automount
*a
);
467 int automount_update_mount(Automount
*a
, MountState old_state
, MountState state
) {
474 case MOUNT_REMOUNTING
:
475 automount_send_ready(a
, a
->tokens
, 0);
476 r
= automount_start_expire(a
);
478 log_unit_warning_errno(UNIT(a
), r
, "Failed to start expiration timer, ignoring: %m");
481 case MOUNT_UNMOUNTING
:
482 case MOUNT_MOUNTING_SIGTERM
:
483 case MOUNT_MOUNTING_SIGKILL
:
484 case MOUNT_REMOUNTING_SIGTERM
:
485 case MOUNT_REMOUNTING_SIGKILL
:
486 case MOUNT_UNMOUNTING_SIGTERM
:
487 case MOUNT_UNMOUNTING_SIGKILL
:
489 if (old_state
!= state
)
490 automount_send_ready(a
, a
->tokens
, -ENODEV
);
491 (void) sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_OFF
);
499 automount_send_ready(a
, a
->expire_tokens
, 0);
502 case MOUNT_MOUNTING_DONE
:
503 case MOUNT_MOUNTING_SIGTERM
:
504 case MOUNT_MOUNTING_SIGKILL
:
505 case MOUNT_REMOUNTING_SIGTERM
:
506 case MOUNT_REMOUNTING_SIGKILL
:
507 case MOUNT_UNMOUNTING_SIGTERM
:
508 case MOUNT_UNMOUNTING_SIGKILL
:
510 if (old_state
!= state
)
511 automount_send_ready(a
, a
->expire_tokens
, -ENODEV
);
520 static void automount_enter_waiting(Automount
*a
) {
521 _cleanup_close_
int ioctl_fd
= -1;
522 int p
[2] = { -1, -1 };
523 char name
[sizeof("systemd-")-1 + DECIMAL_STR_MAX(pid_t
) + 1];
524 char options
[sizeof("fd=,pgrp=,minproto=5,maxproto=5,direct")-1
525 + DECIMAL_STR_MAX(int) + DECIMAL_STR_MAX(gid_t
) + 1];
526 bool mounted
= false;
527 int r
, dev_autofs_fd
;
531 assert(a
->pipe_fd
< 0);
534 set_clear(a
->tokens
);
536 r
= unit_fail_if_symlink(UNIT(a
), a
->where
);
540 (void) mkdir_p_label(a
->where
, 0555);
542 unit_warn_if_dir_nonempty(UNIT(a
), a
->where
);
544 dev_autofs_fd
= open_dev_autofs(UNIT(a
)->manager
);
545 if (dev_autofs_fd
< 0) {
550 if (pipe2(p
, O_NONBLOCK
|O_CLOEXEC
) < 0) {
555 xsprintf(options
, "fd=%i,pgrp="PID_FMT
",minproto=5,maxproto=5,direct", p
[1], getpgrp());
556 xsprintf(name
, "systemd-"PID_FMT
, getpid());
557 if (mount(name
, a
->where
, "autofs", 0, options
) < 0) {
564 p
[1] = safe_close(p
[1]);
566 if (stat(a
->where
, &st
) < 0) {
571 ioctl_fd
= open_ioctl_fd(dev_autofs_fd
, a
->where
, st
.st_dev
);
577 r
= autofs_protocol(dev_autofs_fd
, ioctl_fd
);
581 r
= autofs_set_timeout(dev_autofs_fd
, ioctl_fd
, a
->timeout_idle_usec
);
587 * Unless we close the ioctl fd here, for some weird reason
588 * the direct mount will not receive events from the
591 r
= sd_event_add_io(UNIT(a
)->manager
->event
, &a
->pipe_event_source
, p
[0], EPOLLIN
, automount_dispatch_io
, a
);
595 (void) sd_event_source_set_description(a
->pipe_event_source
, "automount-io");
598 a
->dev_id
= st
.st_dev
;
600 automount_set_state(a
, AUTOMOUNT_WAITING
);
605 log_unit_error_errno(UNIT(a
), r
, "Failed to initialize automounter: %m");
610 r
= repeat_unmount(a
->where
, MNT_DETACH
);
612 log_error_errno(r
, "Failed to unmount, ignoring: %m");
615 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
618 static void *expire_thread(void *p
) {
619 struct autofs_dev_ioctl param
;
620 _cleanup_(expire_data_freep
) struct expire_data
*data
= (struct expire_data
*)p
;
623 assert(data
->dev_autofs_fd
>= 0);
624 assert(data
->ioctl_fd
>= 0);
626 init_autofs_dev_ioctl(¶m
);
627 param
.ioctlfd
= data
->ioctl_fd
;
630 r
= ioctl(data
->dev_autofs_fd
, AUTOFS_DEV_IOCTL_EXPIRE
, ¶m
);
634 log_warning_errno(errno
, "Failed to expire automount, ignoring: %m");
639 static int automount_dispatch_expire(sd_event_source
*source
, usec_t usec
, void *userdata
) {
640 Automount
*a
= AUTOMOUNT(userdata
);
641 _cleanup_(expire_data_freep
) struct expire_data
*data
= NULL
;
645 assert(source
== a
->expire_event_source
);
647 data
= new0(struct expire_data
, 1);
653 data
->dev_autofs_fd
= fcntl(UNIT(a
)->manager
->dev_autofs_fd
, F_DUPFD_CLOEXEC
, 3);
654 if (data
->dev_autofs_fd
< 0)
655 return log_unit_error_errno(UNIT(a
), errno
, "Failed to duplicate autofs fd: %m");
657 data
->ioctl_fd
= open_ioctl_fd(UNIT(a
)->manager
->dev_autofs_fd
, a
->where
, a
->dev_id
);
658 if (data
->ioctl_fd
< 0)
659 return log_unit_error_errno(UNIT(a
), data
->ioctl_fd
, "Couldn't open autofs ioctl fd: %m");
661 r
= asynchronous_job(expire_thread
, data
);
663 return log_unit_error_errno(UNIT(a
), r
, "Failed to start expire job: %m");
667 return automount_start_expire(a
);
670 static int automount_start_expire(Automount
*a
) {
676 if (a
->timeout_idle_usec
== 0)
679 timeout
= now(CLOCK_MONOTONIC
) + MAX(a
->timeout_idle_usec
/3, USEC_PER_SEC
);
681 if (a
->expire_event_source
) {
682 r
= sd_event_source_set_time(a
->expire_event_source
, timeout
);
686 return sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_ONESHOT
);
689 r
= sd_event_add_time(
690 UNIT(a
)->manager
->event
,
691 &a
->expire_event_source
,
692 CLOCK_MONOTONIC
, timeout
, 0,
693 automount_dispatch_expire
, a
);
697 (void) sd_event_source_set_description(a
->expire_event_source
, "automount-expire");
702 static void automount_enter_runnning(Automount
*a
) {
703 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
709 /* We don't take mount requests anymore if we are supposed to
710 * shut down anyway */
711 if (unit_stop_pending(UNIT(a
))) {
712 log_unit_debug(UNIT(a
), "Suppressing automount request since unit stop is scheduled.");
713 automount_send_ready(a
, a
->tokens
, -EHOSTDOWN
);
714 automount_send_ready(a
, a
->expire_tokens
, -EHOSTDOWN
);
718 mkdir_p_label(a
->where
, a
->directory_mode
);
720 /* Before we do anything, let's see if somebody is playing games with us? */
721 if (lstat(a
->where
, &st
) < 0) {
722 log_unit_warning_errno(UNIT(a
), errno
, "Failed to stat automount point: %m");
726 if (!S_ISDIR(st
.st_mode
) || st
.st_dev
!= a
->dev_id
)
727 log_unit_info(UNIT(a
), "Automount point already active?");
729 r
= manager_add_job(UNIT(a
)->manager
, JOB_START
, UNIT_TRIGGER(UNIT(a
)), JOB_REPLACE
, &error
, NULL
);
731 log_unit_warning(UNIT(a
), "Failed to queue mount startup job: %s", bus_error_message(&error
, r
));
736 automount_set_state(a
, AUTOMOUNT_RUNNING
);
740 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
743 static int automount_start(Unit
*u
) {
744 Automount
*a
= AUTOMOUNT(u
);
747 assert(a
->state
== AUTOMOUNT_DEAD
|| a
->state
== AUTOMOUNT_FAILED
);
749 if (path_is_mount_point(a
->where
, 0) > 0) {
750 log_unit_error(u
, "Path %s is already a mount point, refusing start.", a
->where
);
754 if (UNIT_TRIGGER(u
)->load_state
!= UNIT_LOADED
)
757 a
->result
= AUTOMOUNT_SUCCESS
;
758 automount_enter_waiting(a
);
762 static int automount_stop(Unit
*u
) {
763 Automount
*a
= AUTOMOUNT(u
);
766 assert(a
->state
== AUTOMOUNT_WAITING
|| a
->state
== AUTOMOUNT_RUNNING
);
768 automount_enter_dead(a
, AUTOMOUNT_SUCCESS
);
772 static int automount_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
773 Automount
*a
= AUTOMOUNT(u
);
782 unit_serialize_item(u
, f
, "state", automount_state_to_string(a
->state
));
783 unit_serialize_item(u
, f
, "result", automount_result_to_string(a
->result
));
784 unit_serialize_item_format(u
, f
, "dev-id", "%u", (unsigned) a
->dev_id
);
786 SET_FOREACH(p
, a
->tokens
, i
)
787 unit_serialize_item_format(u
, f
, "token", "%u", PTR_TO_UINT(p
));
788 SET_FOREACH(p
, a
->expire_tokens
, i
)
789 unit_serialize_item_format(u
, f
, "expire-token", "%u", PTR_TO_UINT(p
));
791 r
= unit_serialize_item_fd(u
, f
, fds
, "pipe-fd", a
->pipe_fd
);
798 static int automount_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
799 Automount
*a
= AUTOMOUNT(u
);
805 if (streq(key
, "state")) {
806 AutomountState state
;
808 state
= automount_state_from_string(value
);
810 log_unit_debug(u
, "Failed to parse state value: %s", value
);
812 a
->deserialized_state
= state
;
813 } else if (streq(key
, "result")) {
816 f
= automount_result_from_string(value
);
818 log_unit_debug(u
, "Failed to parse result value: %s", value
);
819 else if (f
!= AUTOMOUNT_SUCCESS
)
822 } else if (streq(key
, "dev-id")) {
825 if (safe_atou(value
, &d
) < 0)
826 log_unit_debug(u
, "Failed to parse dev-id value: %s", value
);
828 a
->dev_id
= (unsigned) d
;
829 } else if (streq(key
, "token")) {
832 if (safe_atou(value
, &token
) < 0)
833 log_unit_debug(u
, "Failed to parse token value: %s", value
);
835 r
= set_ensure_allocated(&a
->tokens
, NULL
);
841 r
= set_put(a
->tokens
, UINT_TO_PTR(token
));
843 log_unit_error_errno(u
, r
, "Failed to add token to set: %m");
845 } else if (streq(key
, "expire-token")) {
848 if (safe_atou(value
, &token
) < 0)
849 log_unit_debug(u
, "Failed to parse token value: %s", value
);
851 r
= set_ensure_allocated(&a
->expire_tokens
, NULL
);
857 r
= set_put(a
->expire_tokens
, UINT_TO_PTR(token
));
859 log_unit_error_errno(u
, r
, "Failed to add expire token to set: %m");
861 } else if (streq(key
, "pipe-fd")) {
864 if (safe_atoi(value
, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
865 log_unit_debug(u
, "Failed to parse pipe-fd value: %s", value
);
867 safe_close(a
->pipe_fd
);
868 a
->pipe_fd
= fdset_remove(fds
, fd
);
871 log_unit_debug(u
, "Unknown serialization key: %s", key
);
876 static UnitActiveState
automount_active_state(Unit
*u
) {
879 return state_translation_table
[AUTOMOUNT(u
)->state
];
882 static const char *automount_sub_state_to_string(Unit
*u
) {
885 return automount_state_to_string(AUTOMOUNT(u
)->state
);
888 static bool automount_check_gc(Unit
*u
) {
891 if (!UNIT_TRIGGER(u
))
894 return UNIT_VTABLE(UNIT_TRIGGER(u
))->check_gc(UNIT_TRIGGER(u
));
897 static int automount_dispatch_io(sd_event_source
*s
, int fd
, uint32_t events
, void *userdata
) {
898 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
899 union autofs_v5_packet_union packet
;
900 Automount
*a
= AUTOMOUNT(userdata
);
905 assert(fd
== a
->pipe_fd
);
907 if (events
!= EPOLLIN
) {
908 log_unit_error(UNIT(a
), "Got invalid poll event %"PRIu32
" on pipe (fd=%d)", events
, fd
);
912 r
= loop_read_exact(a
->pipe_fd
, &packet
, sizeof(packet
), true);
914 log_unit_error_errno(UNIT(a
), r
, "Invalid read from pipe: %m");
918 switch (packet
.hdr
.type
) {
920 case autofs_ptype_missing_direct
:
922 if (packet
.v5_packet
.pid
> 0) {
923 _cleanup_free_
char *p
= NULL
;
925 get_process_comm(packet
.v5_packet
.pid
, &p
);
926 log_unit_info(UNIT(a
), "Got automount request for %s, triggered by %"PRIu32
" (%s)", a
->where
, packet
.v5_packet
.pid
, strna(p
));
928 log_unit_debug(UNIT(a
), "Got direct mount request on %s", a
->where
);
930 r
= set_ensure_allocated(&a
->tokens
, NULL
);
932 log_unit_error(UNIT(a
), "Failed to allocate token set.");
936 r
= set_put(a
->tokens
, UINT_TO_PTR(packet
.v5_packet
.wait_queue_token
));
938 log_unit_error_errno(UNIT(a
), r
, "Failed to remember token: %m");
942 automount_enter_runnning(a
);
945 case autofs_ptype_expire_direct
:
946 log_unit_debug(UNIT(a
), "Got direct umount request on %s", a
->where
);
948 (void) sd_event_source_set_enabled(a
->expire_event_source
, SD_EVENT_OFF
);
950 r
= set_ensure_allocated(&a
->expire_tokens
, NULL
);
952 log_unit_error(UNIT(a
), "Failed to allocate token set.");
956 r
= set_put(a
->expire_tokens
, UINT_TO_PTR(packet
.v5_packet
.wait_queue_token
));
958 log_unit_error_errno(UNIT(a
), r
, "Failed to remember token: %m");
962 /* Before we do anything, let's see if somebody is playing games with us? */
963 if (lstat(a
->where
, &st
) < 0) {
964 log_unit_warning_errno(UNIT(a
), errno
, "Failed to stat automount point: %m");
968 if (!S_ISDIR(st
.st_mode
) || st
.st_dev
== a
->dev_id
) {
969 log_unit_info(UNIT(a
), "Automount point already unmounted?");
970 automount_send_ready(a
, a
->expire_tokens
, 0);
974 r
= manager_add_job(UNIT(a
)->manager
, JOB_STOP
, UNIT_TRIGGER(UNIT(a
)), JOB_REPLACE
, &error
, NULL
);
976 log_unit_warning(UNIT(a
), "Failed to queue umount startup job: %s", bus_error_message(&error
, r
));
982 log_unit_error(UNIT(a
), "Received unknown automount request %i", packet
.hdr
.type
);
989 automount_enter_dead(a
, AUTOMOUNT_FAILURE_RESOURCES
);
993 static void automount_shutdown(Manager
*m
) {
996 m
->dev_autofs_fd
= safe_close(m
->dev_autofs_fd
);
999 static void automount_reset_failed(Unit
*u
) {
1000 Automount
*a
= AUTOMOUNT(u
);
1004 if (a
->state
== AUTOMOUNT_FAILED
)
1005 automount_set_state(a
, AUTOMOUNT_DEAD
);
1007 a
->result
= AUTOMOUNT_SUCCESS
;
1010 static bool automount_supported(void) {
1011 static int supported
= -1;
1014 supported
= access("/dev/autofs", F_OK
) >= 0;
1019 static const char* const automount_result_table
[_AUTOMOUNT_RESULT_MAX
] = {
1020 [AUTOMOUNT_SUCCESS
] = "success",
1021 [AUTOMOUNT_FAILURE_RESOURCES
] = "resources"
1024 DEFINE_STRING_TABLE_LOOKUP(automount_result
, AutomountResult
);
1026 const UnitVTable automount_vtable
= {
1027 .object_size
= sizeof(Automount
),
1035 .no_instances
= true,
1037 .init
= automount_init
,
1038 .load
= automount_load
,
1039 .done
= automount_done
,
1041 .coldplug
= automount_coldplug
,
1043 .dump
= automount_dump
,
1045 .start
= automount_start
,
1046 .stop
= automount_stop
,
1048 .serialize
= automount_serialize
,
1049 .deserialize_item
= automount_deserialize_item
,
1051 .active_state
= automount_active_state
,
1052 .sub_state_to_string
= automount_sub_state_to_string
,
1054 .check_gc
= automount_check_gc
,
1056 .reset_failed
= automount_reset_failed
,
1058 .bus_vtable
= bus_automount_vtable
,
1060 .shutdown
= automount_shutdown
,
1061 .supported
= automount_supported
,
1063 .status_message_formats
= {
1064 .finished_start_job
= {
1065 [JOB_DONE
] = "Set up automount %s.",
1066 [JOB_FAILED
] = "Failed to set up automount %s.",
1068 .finished_stop_job
= {
1069 [JOB_DONE
] = "Unset automount %s.",
1070 [JOB_FAILED
] = "Failed to unset automount %s.",