X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fautomount.c;h=5e669c5d323a4b657e741176790f77d402b37bec;hp=730b1572c2ddfff4102e6b9c0e7ee61d0b32de2c;hb=032ff4afc953cae076ce0ee6a0b85020eeb1a75a;hpb=ca9a0317a45f8a4ab702e9b8ce4542d8452a47ad diff --git a/src/automount.c b/src/automount.c index 730b1572c..5e669c5d3 100644 --- a/src/automount.c +++ b/src/automount.c @@ -40,7 +40,7 @@ static const UnitActiveState state_translation_table[_AUTOMOUNT_STATE_MAX] = { [AUTOMOUNT_DEAD] = UNIT_INACTIVE, [AUTOMOUNT_WAITING] = UNIT_ACTIVE, [AUTOMOUNT_RUNNING] = UNIT_ACTIVE, - [AUTOMOUNT_MAINTAINANCE] = UNIT_INACTIVE, + [AUTOMOUNT_MAINTENANCE] = UNIT_MAINTENANCE }; static int open_dev_autofs(Manager *m); @@ -87,8 +87,8 @@ static void unmount_autofs(Automount *a) { /* If we reload/reexecute things we keep the mount point * around */ if (a->where && - (UNIT(a)->meta.manager->exit_code != MANAGER_RELOAD && - UNIT(a)->meta.manager->exit_code != MANAGER_REEXECUTE)) + (a->meta.manager->exit_code != MANAGER_RELOAD && + a->meta.manager->exit_code != MANAGER_REEXECUTE)) repeat_unmout(a->where); } @@ -150,7 +150,7 @@ static int automount_verify(Automount *a) { char *e; assert(a); - if (UNIT(a)->meta.load_state != UNIT_LOADED) + if (a->meta.load_state != UNIT_LOADED) return 0; if (!(e = unit_name_from_path(a->where, ".automount"))) @@ -160,7 +160,7 @@ static int automount_verify(Automount *a) { free(e); if (!b) { - log_error("%s's Where setting doesn't match unit name. Refusing.", UNIT(a)->meta.id); + log_error("%s's Where setting doesn't match unit name. Refusing.", a->meta.id); return -EINVAL; } @@ -212,7 +212,7 @@ static void automount_set_state(Automount *a, AutomountState state) { if (state != old_state) log_debug("%s changed %s -> %s", - UNIT(a)->meta.id, + a->meta.id, automount_state_to_string(old_state), automount_state_to_string(state)); @@ -264,7 +264,7 @@ static void automount_enter_dead(Automount *a, bool success) { if (!success) a->failure = true; - automount_set_state(a, a->failure ? AUTOMOUNT_MAINTAINANCE : AUTOMOUNT_DEAD); + automount_set_state(a, a->failure ? AUTOMOUNT_MAINTENANCE : AUTOMOUNT_DEAD); } static int open_dev_autofs(Manager *m) { @@ -276,18 +276,8 @@ static int open_dev_autofs(Manager *m) { return m->dev_autofs_fd; if ((m->dev_autofs_fd = open("/dev/autofs", O_CLOEXEC|O_RDONLY)) < 0) { - - if (errno == ENOENT || errno == ENODEV) { - log_error("Your kernel apparently lacks built-in autofs4 support. Please fix that. " - "We'll now try to work around this by calling 'modprobe autofs4'..."); - system("/sbin/modprobe -q -- autofs4"); - m->dev_autofs_fd = open("/dev/autofs", O_CLOEXEC|O_RDONLY); - } - - if (m->dev_autofs_fd < 0) { - log_error("Failed to open /dev/autofs: %s", strerror(errno)); - return -errno; - } + log_error("Failed to open /dev/autofs: %s", strerror(errno)); + return -errno; } init_autofs_dev_ioctl(¶m); @@ -413,7 +403,7 @@ int automount_send_ready(Automount *a, int status) { if (set_isempty(a->tokens)) return 0; - if ((ioctl_fd = open_ioctl_fd(UNIT(a)->meta.manager->dev_autofs_fd, a->where, a->dev_id)) < 0) { + if ((ioctl_fd = open_ioctl_fd(a->meta.manager->dev_autofs_fd, a->where, a->dev_id)) < 0) { r = ioctl_fd; goto fail; } @@ -432,7 +422,7 @@ int automount_send_ready(Automount *a, int status) { * if you pass a positive status code here, the kernel will * freeze! Yay! */ - if ((k = autofs_send_ready(UNIT(a)->meta.manager->dev_autofs_fd, + if ((k = autofs_send_ready(a->meta.manager->dev_autofs_fd, ioctl_fd, token, status)) < 0) @@ -462,7 +452,7 @@ static void automount_enter_waiting(Automount *a) { if (a->tokens) set_clear(a->tokens); - if ((dev_autofs_fd = open_dev_autofs(UNIT(a)->meta.manager)) < 0) { + if ((dev_autofs_fd = open_dev_autofs(a->meta.manager)) < 0) { r = dev_autofs_fd; goto fail; } @@ -555,7 +545,7 @@ static void automount_enter_runnning(Automount *a) { if (!S_ISDIR(st.st_mode) || st.st_dev != a->dev_id) log_info("%s's automount point already active?", a->meta.id); - else if ((r = manager_add_job(UNIT(a)->meta.manager, JOB_START, UNIT(a->mount), JOB_REPLACE, true, NULL)) < 0) { + else if ((r = manager_add_job(a->meta.manager, JOB_START, UNIT(a->mount), JOB_REPLACE, true, NULL)) < 0) { log_warning("%s failed to queue mount startup job: %s", a->meta.id, strerror(-r)); goto fail; } @@ -572,12 +562,15 @@ static int automount_start(Unit *u) { assert(a); + assert(a->state == AUTOMOUNT_DEAD || a->state == AUTOMOUNT_MAINTENANCE); + if (path_is_mount_point(a->where)) { log_error("Path %s is already a mount point, refusing start for %s", a->where, u->meta.id); return -EEXIST; } - assert(a->state == AUTOMOUNT_DEAD || a->state == AUTOMOUNT_MAINTAINANCE); + if (a->mount->meta.load_state != UNIT_LOADED) + return -ENOENT; a->failure = false; automount_enter_waiting(a); @@ -715,7 +708,7 @@ static void automount_fd_event(Unit *u, int fd, uint32_t events, Watch *w) { goto fail; } - if ((l = loop_read(a->pipe_fd, &packet, sizeof(packet))) != sizeof(packet)) { + if ((l = loop_read(a->pipe_fd, &packet, sizeof(packet), true)) != sizeof(packet)) { log_error("Invalid read from pipe: %s", l < 0 ? strerror(-l) : "short read"); goto fail; } @@ -761,7 +754,7 @@ static const char* const automount_state_table[_AUTOMOUNT_STATE_MAX] = { [AUTOMOUNT_DEAD] = "dead", [AUTOMOUNT_WAITING] = "waiting", [AUTOMOUNT_RUNNING] = "running", - [AUTOMOUNT_MAINTAINANCE] = "maintainance" + [AUTOMOUNT_MAINTENANCE] = "maintenance" }; DEFINE_STRING_TABLE_LOOKUP(automount_state, AutomountState);