[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] This patch creates a mount point for libvirt-lxc containers to mount on the destination system if it does not exist.



-----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) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]