From 30f5d10421e6b1a22cf5d707a9c90c32914bce6b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 22 Sep 2020 16:32:07 +0200 Subject: [PATCH] mount-util: rework umount_verbose() to take log level and flags arg Let's make umount_verbose() more like mount_verbose_xyz(), i.e. take log level and flags param. In particular the latter matters, since we typically don't actually want to follow symlinks when unmounting. --- src/core/automount.c | 4 ++-- src/home/homework-directory.c | 2 +- src/home/homework-luks.c | 8 ++++---- src/home/homework-mount.c | 2 +- src/home/homework.c | 2 +- src/nspawn/nspawn-cgroup.c | 2 +- src/nspawn/nspawn-mount.c | 11 ++++++----- src/shared/mount-util.c | 15 ++++++++++++--- src/shared/mount-util.h | 5 ++++- src/volatile-root/volatile-root.c | 2 +- 10 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/core/automount.c b/src/core/automount.c index 8318deef8a..b0d43a3ef4 100644 --- a/src/core/automount.c +++ b/src/core/automount.c @@ -94,7 +94,7 @@ static void unmount_autofs(Automount *a) { automount_send_ready(a, a->expire_tokens, -EHOSTDOWN); if (a->where) { - r = repeat_unmount(a->where, MNT_DETACH); + r = repeat_unmount(a->where, MNT_DETACH|UMOUNT_NOFOLLOW); if (r < 0) log_error_errno(r, "Failed to unmount: %m"); } @@ -647,7 +647,7 @@ fail: safe_close_pair(p); if (mounted) { - r = repeat_unmount(a->where, MNT_DETACH); + r = repeat_unmount(a->where, MNT_DETACH|UMOUNT_NOFOLLOW); if (r < 0) log_error_errno(r, "Failed to unmount, ignoring: %m"); } diff --git a/src/home/homework-directory.c b/src/home/homework-directory.c index 49660c7389..bffeac0a5e 100644 --- a/src/home/homework-directory.c +++ b/src/home/homework-directory.c @@ -67,7 +67,7 @@ int home_activate_directory( r = mount_nofollow_verbose(LOG_ERR, NULL, hd, NULL, MS_BIND|MS_REMOUNT|user_record_mount_flags(h), NULL); if (r < 0) { - (void) umount_verbose(hd); + (void) umount_verbose(LOG_ERR, hd, UMOUNT_NOFOLLOW); return r; } diff --git a/src/home/homework-luks.c b/src/home/homework-luks.c index f13f41e612..947a559c26 100644 --- a/src/home/homework-luks.c +++ b/src/home/homework-luks.c @@ -1259,7 +1259,7 @@ int home_prepare_luks( fail: if (mounted) - (void) umount_verbose("/run/systemd/user-home-mount"); + (void) umount_verbose(LOG_ERR, "/run/systemd/user-home-mount", UMOUNT_NOFOLLOW); if (dm_activated) (void) crypt_deactivate(cd, setup->dm_name); @@ -2168,7 +2168,7 @@ int home_create_luks( root_fd = safe_close(root_fd); - r = umount_verbose("/run/systemd/user-home-mount"); + r = umount_verbose(LOG_ERR, "/run/systemd/user-home-mount", UMOUNT_NOFOLLOW); if (r < 0) goto fail; @@ -2238,7 +2238,7 @@ fail: root_fd = safe_close(root_fd); if (mounted) - (void) umount_verbose("/run/systemd/user-home-mount"); + (void) umount_verbose(LOG_WARNING, "/run/systemd/user-home-mount", UMOUNT_NOFOLLOW); if (dm_activated) (void) crypt_deactivate(cd, dm_name); @@ -2340,7 +2340,7 @@ static int ext4_offline_resize_fs(HomeSetup *setup, uint64_t new_size, bool disc } if (setup->undo_mount) { - r = umount_verbose("/run/systemd/user-home-mount"); + r = umount_verbose(LOG_ERR, "/run/systemd/user-home-mount", UMOUNT_NOFOLLOW); if (r < 0) return r; diff --git a/src/home/homework-mount.c b/src/home/homework-mount.c index 7c94de49cc..853181b80d 100644 --- a/src/home/homework-mount.c +++ b/src/home/homework-mount.c @@ -87,7 +87,7 @@ int home_move_mount(const char *user_name_and_realm, const char *target) { if (r < 0) return r; - r = umount_verbose("/run/systemd/user-home-mount"); + r = umount_verbose(LOG_ERR, "/run/systemd/user-home-mount", UMOUNT_NOFOLLOW); if (r < 0) return r; diff --git a/src/home/homework.c b/src/home/homework.c index 986ce2b3f0..14e2002c73 100644 --- a/src/home/homework.c +++ b/src/home/homework.c @@ -291,7 +291,7 @@ int home_setup_undo(HomeSetup *setup) { } if (setup->undo_mount) { - q = umount_verbose("/run/systemd/user-home-mount"); + q = umount_verbose(LOG_DEBUG, "/run/systemd/user-home-mount", UMOUNT_NOFOLLOW); if (q < 0) r = q; } diff --git a/src/nspawn/nspawn-cgroup.c b/src/nspawn/nspawn-cgroup.c index 508b8b6460..f7b34ccc58 100644 --- a/src/nspawn/nspawn-cgroup.c +++ b/src/nspawn/nspawn-cgroup.c @@ -136,7 +136,7 @@ int sync_cgroup(pid_t pid, CGroupUnified unified_requested, uid_t uid_shift) { log_error_errno(r, "Failed to chown() cgroup %s: %m", fn); finish: if (undo_mount) - (void) umount_verbose(tree); + (void) umount_verbose(LOG_ERR, tree, UMOUNT_NOFOLLOW); (void) rmdir(tree); return r; diff --git a/src/nspawn/nspawn-mount.c b/src/nspawn/nspawn-mount.c index 8c5bcd890d..065099cf39 100644 --- a/src/nspawn/nspawn-mount.c +++ b/src/nspawn/nspawn-mount.c @@ -472,7 +472,7 @@ int mount_sysfs(const char *dest, MountSettingsMask mount_settings) { return r; } - r = umount_verbose(full); + r = umount_verbose(LOG_ERR, full, UMOUNT_NOFOLLOW); if (r < 0) return r; @@ -895,7 +895,7 @@ static int mount_inaccessible(const char *dest, CustomMount *m) { r = mount_nofollow_verbose(m->graceful ? LOG_DEBUG : LOG_ERR, NULL, where, NULL, MS_BIND|MS_RDONLY|MS_REMOUNT, NULL); if (r < 0) { - (void) umount_verbose(where); + (void) umount_verbose(m->graceful ? LOG_DEBUG : LOG_ERR, where, UMOUNT_NOFOLLOW); return m->graceful ? 0 : r; } @@ -1099,10 +1099,11 @@ static int setup_volatile_yes(const char *directory, uid_t uid_shift, const char fail: if (bind_mounted) - (void) umount_verbose(t); + (void) umount_verbose(LOG_ERR, t, UMOUNT_NOFOLLOW); if (tmpfs_mounted) - (void) umount_verbose(template); + (void) umount_verbose(LOG_ERR, template, UMOUNT_NOFOLLOW); + (void) rmdir(template); return r; } @@ -1163,7 +1164,7 @@ static int setup_volatile_overlay(const char *directory, uid_t uid_shift, const finish: if (tmpfs_mounted) - (void) umount_verbose(template); + (void) umount_verbose(LOG_ERR, template, UMOUNT_NOFOLLOW); (void) rmdir(template); return r; diff --git a/src/shared/mount-util.c b/src/shared/mount-util.c index 9ff96bd3be..e0a0315639 100644 --- a/src/shared/mount-util.c +++ b/src/shared/mount-util.c @@ -658,10 +658,19 @@ int mount_verbose_full( return 0; } -int umount_verbose(const char *what) { +int umount_verbose( + int error_log_level, + const char *what, + int flags) { + + assert(what); + log_debug("Umounting %s...", what); - if (umount(what) < 0) - return log_error_errno(errno, "Failed to unmount %s: %m", what); + + if (umount2(what, flags) < 0) + return log_full_errno(error_log_level, errno, + "Failed to unmount %s: %m", what); + return 0; } diff --git a/src/shared/mount-util.h b/src/shared/mount-util.h index b377e68851..ba5d6280d2 100644 --- a/src/shared/mount-util.h +++ b/src/shared/mount-util.h @@ -75,7 +75,10 @@ static inline int mount_nofollow_verbose( return mount_verbose_full(error_log_level, what, where, type, flags, options, false); } -int umount_verbose(const char *where); +int umount_verbose( + int error_log_level, + const char *where, + int flags); int mount_option_mangle( const char *options, diff --git a/src/volatile-root/volatile-root.c b/src/volatile-root/volatile-root.c index 35c045630f..04c371077a 100644 --- a/src/volatile-root/volatile-root.c +++ b/src/volatile-root/volatile-root.c @@ -107,7 +107,7 @@ static int make_overlay(const char *path) { finish: if (tmpfs_mounted) - (void) umount_verbose("/run/systemd/overlay-sysroot"); + (void) umount_verbose(LOG_ERR, "/run/systemd/overlay-sysroot", UMOUNT_NOFOLLOW); (void) rmdir("/run/systemd/overlay-sysroot"); return r;