From: Lennart Poettering Date: Tue, 27 Apr 2021 14:13:51 +0000 (+0200) Subject: mount-util: add helper that ensures something is a mount point X-Git-Tag: v249-rc1~269^2~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=14a25e1faee2eff04b178ed4ebbb1bd131ce2261;p=thirdparty%2Fsystemd.git mount-util: add helper that ensures something is a mount point --- diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index ee84495ca26..38d6eeacc7e 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 13f202d7e7d..2c38f93917c 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 6469181d1cf..59cf75606df 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);