summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlban Crequy <alban@endocode.com>2015-01-22 16:47:07 +0100
committerLennart Poettering <lennart@poettering.net>2015-01-23 01:22:55 +0100
commit05e7da5afa07b5620c06507a3f033334a5179d21 (patch)
tree6e390a4a231825adcaba5aad16bb8ae436cb8af0 /src
parent24fdceabbf97adc2fe4f5d55eb33cd5f079c44e7 (diff)
nspawn: allow bind-mounting char and block files
Diffstat (limited to 'src')
-rw-r--r--src/nspawn/nspawn.c27
1 files changed, 11 insertions, 16 deletions
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
index d0e4ee785c..25828cf3cc 100644
--- a/src/nspawn/nspawn.c
+++ b/src/nspawn/nspawn.c
@@ -913,8 +913,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) {
@@ -926,27 +930,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)