automount: move generically userful call repeat_mount() into mount-util.[ch]

This commit is contained in:
Lennart Poettering 2015-10-27 14:25:58 +01:00
parent 7b3e062cb6
commit 3f2c0becc3
3 changed files with 37 additions and 22 deletions

View File

@ -506,3 +506,24 @@ bool fstype_is_network(const char *fstype) {
return nulstr_contains(table, fstype);
}
int repeat_unmount(const char *path, int flags) {
bool done = false;
assert(path);
/* If there are multiple mounts on a mount point, this
* removes them all */
for (;;) {
if (umount2(path, flags) < 0) {
if (errno == EINVAL)
return done;
return -errno;
}
done = true;
}
}

View File

@ -32,6 +32,8 @@
int fd_is_mount_point(int fd, const char *filename, int flags);
int path_is_mount_point(const char *path, int flags);
int repeat_unmount(const char *path, int flags);
int umount_recursive(const char *target, int flags);
int bind_remount_recursive(const char *prefix, bool ro);

View File

@ -89,26 +89,11 @@ static void automount_init(Unit *u) {
UNIT(a)->ignore_on_isolate = true;
}
static void repeat_unmount(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;
if (errno != EINVAL)
log_error_errno(errno, "Failed to unmount: %m");
break;
}
}
static int automount_send_ready(Automount *a, Set *tokens, int status);
static void unmount_autofs(Automount *a) {
int r;
assert(a);
if (a->pipe_fd < 0)
@ -124,8 +109,11 @@ static void unmount_autofs(Automount *a) {
* around */
if (a->where &&
(UNIT(a)->manager->exit_code != MANAGER_RELOAD &&
UNIT(a)->manager->exit_code != MANAGER_REEXECUTE))
repeat_unmount(a->where);
UNIT(a)->manager->exit_code != MANAGER_REEXECUTE)) {
r = repeat_unmount(a->where, MNT_DETACH);
if (r < 0)
log_error_errno(r, "Failed to unmount: %m");
}
}
static void automount_done(Unit *u) {
@ -615,12 +603,16 @@ static void automount_enter_waiting(Automount *a) {
return;
fail:
log_unit_error_errno(UNIT(a), r, "Failed to initialize automounter: %m");
safe_close_pair(p);
if (mounted)
repeat_unmount(a->where);
if (mounted) {
r = repeat_unmount(a->where, MNT_DETACH);
if (r < 0)
log_error_errno(r, "Failed to unmount, ignoring: %m");
}
log_unit_error_errno(UNIT(a), r, "Failed to initialize automounter: %m");
automount_enter_dead(a, AUTOMOUNT_FAILURE_RESOURCES);
}