From 14a25e1faee2eff04b178ed4ebbb1bd131ce2261 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 27 Apr 2021 16:13:51 +0200 Subject: [PATCH] mount-util: add helper that ensures something is a mount point --- src/nspawn/nspawn.c | 8 +++----- src/shared/mount-util.c | 20 ++++++++++++++++++++ src/shared/mount-util.h | 2 ++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index ee84495ca2..38d6eeacc7 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -3688,11 +3688,9 @@ static int outer_child( return r; /* Make sure we always have a mount that we can move to root later on. */ - if (!path_is_mount_point(directory, NULL, 0)) { - r = mount_nofollow_verbose(LOG_ERR, directory, directory, NULL, MS_BIND|MS_REC, NULL); - if (r < 0) - return r; - } + r = make_mount_point(directory); + if (r < 0) + return r; if (dissected_image) { /* Now we know the uid shift, let's now mount everything else that might be in the image. */ diff --git a/src/shared/mount-util.c b/src/shared/mount-util.c index 13f202d7e7..2c38f93917 100644 --- a/src/shared/mount-util.c +++ b/src/shared/mount-util.c @@ -986,3 +986,23 @@ int mount_image_in_namespace( return mount_in_namespace(target, propagate_path, incoming_path, src, dest, read_only, make_file_or_directory, options, true); } + +int make_mount_point(const char *path) { + int r; + + assert(path); + + /* If 'path' is already a mount point, does nothing and returns 0. If it is not it makes it one, and returns 1. */ + + r = path_is_mount_point(path, NULL, 0); + if (r < 0) + return log_debug_errno(r, "Failed to determine whether '%s' is a mount point: %m", path); + if (r > 0) + return 0; + + r = mount_nofollow_verbose(LOG_DEBUG, path, path, NULL, MS_BIND|MS_REC, NULL); + if (r < 0) + return r; + + return 1; +} diff --git a/src/shared/mount-util.h b/src/shared/mount-util.h index 6469181d1c..59cf75606d 100644 --- a/src/shared/mount-util.h +++ b/src/shared/mount-util.h @@ -103,3 +103,5 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(char*, umount_and_rmdir_and_free); int bind_mount_in_namespace(pid_t target, const char *propagate_path, const char *incoming_path, const char *src, const char *dest, bool read_only, bool make_file_or_directory); int mount_image_in_namespace(pid_t target, const char *propagate_path, const char *incoming_path, const char *src, const char *dest, bool read_only, bool make_file_or_directory, const MountOptions *options); + +int make_mount_point(const char *path);