[systemd-devel] [PATCH v2] nspawn: allow bind-mounting char and block files

Lennart Poettering lennart at poettering.net
Thu Jan 22 18:03:20 PST 2015


On Thu, 22.01.15 16:47, Alban Crequy (muadda at gmail.com) wrote:

> From: Alban Crequy <alban at endocode.com>
> 
> v2:
> - simplify the patch: any non-directory file can be mounted on any
>   non-directory file.
> - allow bind mount of files of different types

Applied! Thanks!

> ---
>  src/nspawn/nspawn.c | 27 +++++++++++----------------
>  1 file changed, 11 insertions(+), 16 deletions(-)
> 
> diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
> index 3fce3ad..2736c0a 100644
> --- a/src/nspawn/nspawn.c
> +++ b/src/nspawn/nspawn.c
> @@ -898,8 +898,12 @@ static int mount_binds(const char *dest, char **l, bool ro) {
>  
>                  r = stat(where, &dest_st);
>                  if (r == 0) {
> -                        if ((source_st.st_mode & S_IFMT) != (dest_st.st_mode & S_IFMT)) {
> -                                log_error("The file types of %s and %s do not match. Refusing bind mount", *x, where);
> +                        if (S_ISDIR(source_st.st_mode) && !S_ISDIR(dest_st.st_mode)) {
> +                                log_error("Cannot bind mount directory %s on file %s", *x, where);
> +                                return -EINVAL;
> +                        }
> +                        if (!S_ISDIR(source_st.st_mode) && S_ISDIR(dest_st.st_mode)) {
> +                                log_error("Cannot bind mount file %s on directory %s", *x, where);
>                                  return -EINVAL;
>                          }
>                  } else if (errno == ENOENT) {
> @@ -911,27 +915,18 @@ static int mount_binds(const char *dest, char **l, bool ro) {
>                          return -errno;
>                  }
>  
> -                /* Create the mount point, but be conservative -- refuse to create block
> -                 * and char devices. */
> +                /* Create the mount point. Any non-directory file can be
> +                 * mounted on any non-directory file (regular, fifo, socket,
> +                 * char, block).
> +                 */
>                  if (S_ISDIR(source_st.st_mode)) {
>                          r = mkdir_label(where, 0755);
>                          if (r < 0 && errno != EEXIST)
>                                  return log_error_errno(r, "Failed to create mount point %s: %m", where);
> -                } else if (S_ISFIFO(source_st.st_mode)) {
> -                        r = mkfifo(where, 0644);
> -                        if (r < 0 && errno != EEXIST)
> -                                return log_error_errno(errno, "Failed to create mount point %s: %m", where);
> -                } else if (S_ISSOCK(source_st.st_mode)) {
> -                        r = mknod(where, 0644 | S_IFSOCK, 0);
> -                        if (r < 0 && errno != EEXIST)
> -                                return log_error_errno(errno, "Failed to create mount point %s: %m", where);
> -                } else if (S_ISREG(source_st.st_mode)) {
> +                } else {
>                          r = touch(where);
>                          if (r < 0)
>                                  return log_error_errno(r, "Failed to create mount point %s: %m", where);
> -                } else {
> -                        log_error("Refusing to create mountpoint for file: %s", *x);
> -                        return -ENOTSUP;
>                  }
>  
>                  if (mount(*x, where, "bind", MS_BIND, NULL) < 0)
> -- 
> 2.1.4
> 
> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Lennart

-- 
Lennart Poettering, Red Hat


More information about the systemd-devel mailing list