-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Currently libvirt-lxc checks to see if the destination exists and is a directory. If it is not a directory then the mount fails. Since libvirt-lxc can bind mount files on an inode, this patch is needed to allow us to bind mount files on files. Currently we want to bind mount on top of /etc/machine-id, and /etc/adjtime If the destination of the mount point does not exists, it checks if the src is a directory and then attempts to create a directory, otherwise it creates an empty file for the destination. The code will then bind mount over the destination. Current code blows up if the destination was not a directory. We want to be able to bind mount files on files. Sorry if you are seeing this patch for the second time, since I sent it to the wrong list. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk/kel4ACgkQrlYvE4MpobP7uwCfXUPMJP4bNZiBGTwnJ70dezVf KPwAnjt3MYSlHxkcwZCe5H1X4C0P4ky/ =1te/ -----END PGP SIGNATURE-----
diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c index 24b1017..6cd8760 100644 --- a/src/lxc/lxc_container.c +++ b/src/lxc/lxc_container.c @@ -648,17 +665,37 @@ static int lxcContainerMountFSBind(virDomainFSDefPtr fs, { char *src = NULL; int ret = -1; + struct stat st; if (virAsprintf(&src, "%s%s", srcprefix, fs->src) < 0) { virReportOOMError(); goto cleanup; } - if (virFileMakePath(fs->dst) < 0) { - virReportSystemError(errno, - _("Failed to create %s"), - fs->dst); - goto cleanup; + if ((stat(fs->dst, &st) < 0) && (errno == ENOENT)) { + if (stat(src, &st) >= 0) { + if (S_ISDIR(st.st_mode)) { + if (virFileMakePath(fs->dst) < 0) { + virReportSystemError(errno, + _("Failed to create %s"), + fs->dst); + goto cleanup; + } + } else { + /* Create Empty file for target mount point */ + int fd = open(fs->dst, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666); + if (fd >= 0) { + close(fd); + } else { + if (errno != EEXIST) { + virReportSystemError(errno, + _("Failed to create %s"), + fs->dst); + goto cleanup; + } + } + } + } } if (mount(src, fs->dst, NULL, MS_BIND, NULL) < 0) {
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list