automount: move generically userful call repeat_mount() into mount-util.[ch]
This commit is contained in:
parent
7b3e062cb6
commit
3f2c0becc3
|
@ -506,3 +506,24 @@ bool fstype_is_network(const char *fstype) {
|
||||||
|
|
||||||
return nulstr_contains(table, 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
int fd_is_mount_point(int fd, const char *filename, int flags);
|
int fd_is_mount_point(int fd, const char *filename, int flags);
|
||||||
int path_is_mount_point(const char *path, 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 umount_recursive(const char *target, int flags);
|
||||||
int bind_remount_recursive(const char *prefix, bool ro);
|
int bind_remount_recursive(const char *prefix, bool ro);
|
||||||
|
|
||||||
|
|
|
@ -89,26 +89,11 @@ static void automount_init(Unit *u) {
|
||||||
UNIT(a)->ignore_on_isolate = true;
|
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 int automount_send_ready(Automount *a, Set *tokens, int status);
|
||||||
|
|
||||||
static void unmount_autofs(Automount *a) {
|
static void unmount_autofs(Automount *a) {
|
||||||
|
int r;
|
||||||
|
|
||||||
assert(a);
|
assert(a);
|
||||||
|
|
||||||
if (a->pipe_fd < 0)
|
if (a->pipe_fd < 0)
|
||||||
|
@ -124,8 +109,11 @@ static void unmount_autofs(Automount *a) {
|
||||||
* around */
|
* around */
|
||||||
if (a->where &&
|
if (a->where &&
|
||||||
(UNIT(a)->manager->exit_code != MANAGER_RELOAD &&
|
(UNIT(a)->manager->exit_code != MANAGER_RELOAD &&
|
||||||
UNIT(a)->manager->exit_code != MANAGER_REEXECUTE))
|
UNIT(a)->manager->exit_code != MANAGER_REEXECUTE)) {
|
||||||
repeat_unmount(a->where);
|
r = repeat_unmount(a->where, MNT_DETACH);
|
||||||
|
if (r < 0)
|
||||||
|
log_error_errno(r, "Failed to unmount: %m");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void automount_done(Unit *u) {
|
static void automount_done(Unit *u) {
|
||||||
|
@ -615,12 +603,16 @@ static void automount_enter_waiting(Automount *a) {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
log_unit_error_errno(UNIT(a), r, "Failed to initialize automounter: %m");
|
||||||
|
|
||||||
safe_close_pair(p);
|
safe_close_pair(p);
|
||||||
|
|
||||||
if (mounted)
|
if (mounted) {
|
||||||
repeat_unmount(a->where);
|
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);
|
automount_enter_dead(a, AUTOMOUNT_FAILURE_RESOURCES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue