X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=automount.c;h=465354f5556503f82f790c8b0f69c973ca1d1a04;hb=136337ff74f05be3d42a769d9f0cb99716c5c40f;hp=7aa55b4f9f0999ca4fc86a0234031d9b776ff9fb;hpb=a16e112358ea8fea381ee106b89e645aed8b0a8c;p=elogind.git diff --git a/automount.c b/automount.c index 7aa55b4f9..465354f55 100644 --- a/automount.c +++ b/automount.c @@ -105,6 +105,41 @@ static void automount_done(Unit *u) { a->tokens = NULL; } +int automount_add_one_mount_link(Automount *a, Mount *m) { + int r; + + assert(a); + assert(m); + + if (a->meta.load_state != UNIT_LOADED || + m->meta.load_state != UNIT_LOADED) + return 0; + + if (!path_startswith(a->where, m->where)) + return 0; + + if ((r = unit_add_dependency(UNIT(m), UNIT_BEFORE, UNIT(a), true)) < 0) + return r; + + if ((r = unit_add_dependency(UNIT(a), UNIT_REQUIRES, UNIT(m), true)) < 0) + return r; + + return 0; +} + +static int automount_add_mount_links(Automount *a) { + Meta *other; + int r; + + assert(a); + + LIST_FOREACH(units_per_type, other, a->meta.manager->units_per_type[UNIT_MOUNT]) + if ((r = automount_add_one_mount_link(a, (Mount*) other)) < 0) + return r; + + return 0; +} + static int automount_verify(Automount *a) { bool b; char *e; @@ -146,10 +181,13 @@ static int automount_load(Unit *u) { path_kill_slashes(a->where); + if ((r = automount_add_mount_links(a)) < 0) + return r; + if ((r = unit_load_related_unit(u, ".mount", (Unit**) &a->mount)) < 0) return r; - if ((r = unit_add_dependency(u, UNIT_BEFORE, UNIT(a->mount))) < 0) + if ((r = unit_add_dependency(u, UNIT_BEFORE, UNIT(a->mount), true)) < 0) return r; } @@ -168,7 +206,7 @@ static void automount_set_state(Automount *a, AutomountState state) { unmount_autofs(a); if (state != old_state) - log_debug("%s changed %s → %s", + log_debug("%s changed %s -> %s", UNIT(a)->meta.id, automount_state_to_string(old_state), automount_state_to_string(state)); @@ -640,13 +678,20 @@ static const char *automount_sub_state_to_string(Unit *u) { return automount_state_to_string(AUTOMOUNT(u)->state); } +static bool automount_check_gc(Unit *u) { + Automount *a = AUTOMOUNT(u); + + assert(a); + + return UNIT_VTABLE(UNIT(a->mount))->check_gc(UNIT(a->mount)); +} + static void automount_fd_event(Unit *u, int fd, uint32_t events, Watch *w) { + Automount *a = AUTOMOUNT(u); union autofs_v5_packet_union packet; ssize_t l; int r; - Automount *a = AUTOMOUNT(u); - assert(a); assert(fd == a->pipe_fd); @@ -729,6 +774,8 @@ const UnitVTable automount_vtable = { .active_state = automount_active_state, .sub_state_to_string = automount_sub_state_to_string, + .check_gc = automount_check_gc, + .fd_event = automount_fd_event, .bus_message_handler = bus_automount_message_handler,