On Thu, 22.01.15 16:47, Alban Crequy ([email protected]) wrote:

> From: Alban Crequy <[email protected]>
> 
> 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
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Lennart

-- 
Lennart Poettering, Red Hat
_______________________________________________
systemd-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to