X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fautomount.c;h=3d85605fb4f46a7cd7f110b278716bd99deb31d0;hb=8745297f9853c4a17bac69e1b7e652fe81bc1940;hp=465354f5556503f82f790c8b0f69c973ca1d1a04;hpb=e99e38bbdcca3fe5956823bdb3d38544ccf93221;p=elogind.git diff --git a/src/automount.c b/src/automount.c index 465354f55..3d85605fb 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_INACTIVE, }; static int open_dev_autofs(Manager *m); @@ -59,6 +59,8 @@ static void repeat_unmout(const char *path) { assert(path); for (;;) { + /* If there are multiple mounts on a mount point, this + * removes them all */ if (umount2(path, MNT_DETACH) >= 0) continue; @@ -118,6 +120,9 @@ int automount_add_one_mount_link(Automount *a, Mount *m) { if (!path_startswith(a->where, m->where)) return 0; + if (path_equal(a->where, m->where)) + return 0; + if ((r = unit_add_dependency(UNIT(m), UNIT_BEFORE, UNIT(a), true)) < 0) return r; @@ -259,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) { @@ -557,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); @@ -746,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);