[libvirt] [PATCH 6/7] Support NBD backed disks/filesystems in LXC driver

Daniel P. Berrange berrange at redhat.com
Fri Mar 15 16:32:43 UTC 2013


From: "Daniel P. Berrange" <berrange at redhat.com>

The LXC driver can already configure <disk> or <filesystem>
devices to use the loop device. This extends it to also allow
for use of the NBD device, to support non-raw formats.

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 src/lxc/lxc_controller.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 62 insertions(+), 2 deletions(-)

diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index 8f3ca6a..c433fb1 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -403,6 +403,46 @@ static int virLXCControllerSetupLoopDeviceDisk(virDomainDiskDefPtr disk)
 }
 
 
+static int virLXCControllerSetupNBDDeviceFS(virDomainFSDefPtr fs)
+{
+    char *dev;
+
+    if (virFileNBDDeviceAssociate(fs->src, &dev,
+                                  !!fs->readonly) < 0)
+        return -1;
+
+    /*
+     * We now change it into a block device type, so that
+     * the rest of container setup 'just works'
+     */
+    fs->type = VIR_DOMAIN_DISK_TYPE_BLOCK;
+    VIR_FREE(fs->src);
+    fs->src = dev;
+
+    return 0;
+}
+
+
+static int virLXCControllerSetupNBDDeviceDisk(virDomainDiskDefPtr disk)
+{
+    char *dev;
+
+    if (virFileNBDDeviceAssociate(disk->src, &dev,
+                                  !!disk->readonly) < 0)
+        return -1;
+
+    /*
+     * We now change it into a block device type, so that
+     * the rest of container setup 'just works'
+     */
+    disk->type = VIR_DOMAIN_DISK_TYPE_BLOCK;
+    VIR_FREE(disk->src);
+    disk->src = dev;
+
+    return 0;
+}
+
+
 static int virLXCControllerSetupLoopDevices(virLXCControllerPtr ctrl)
 {
     size_t i;
@@ -435,6 +475,9 @@ static int virLXCControllerSetupLoopDevices(virLXCControllerPtr ctrl)
                 goto cleanup;
             }
             ctrl->loopDevFds[ctrl->nloopDevs - 1] = fd;
+        } else if (fs->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_NBD) {
+            if (virLXCControllerSetupNBDDeviceFS(fs) < 0)
+                goto cleanup;
         } else {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                            _("fs driver %s is not supported"),
@@ -449,8 +492,14 @@ static int virLXCControllerSetupLoopDevices(virLXCControllerPtr ctrl)
         if (disk->type != VIR_DOMAIN_DISK_TYPE_FILE)
             continue;
 
-        if (!disk->driverName ||
-            STREQ(disk->driverName, "loop")) {
+        /* If no driverName is set, we prefer 'loop' for
+         * dealing with raw or undefined formats. Only
+         * default to 'nbd' for non-raw formats.
+         */
+        if ((disk->driverName && STREQ(disk->driverName, "loop")) ||
+            (!disk->driverName &&
+             (disk->format == VIR_STORAGE_FILE_RAW ||
+              disk->format == VIR_STORAGE_FILE_NONE))) {
             if (disk->format != VIR_STORAGE_FILE_RAW &&
                 disk->format != VIR_STORAGE_FILE_NONE) {
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -474,6 +523,17 @@ static int virLXCControllerSetupLoopDevices(virLXCControllerPtr ctrl)
                 goto cleanup;
             }
             ctrl->loopDevFds[ctrl->nloopDevs - 1] = fd;
+        } else if (!disk->driverName ||
+                   STREQ(disk->driverName, "nbd")) {
+            if (disk->cachemode != VIR_DOMAIN_DISK_CACHE_DEFAULT &&
+                disk->cachemode != VIR_DOMAIN_DISK_CACHE_DISABLE) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                               _("Disk cache mode %s is not supported"),
+                               virDomainDiskCacheTypeToString(disk->cachemode));
+                goto cleanup;
+            }
+            if (virLXCControllerSetupNBDDeviceDisk(disk) < 0)
+                goto cleanup;
         } else {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                            _("disk driver %s is not supported"),
-- 
1.7.11.7




More information about the libvir-list mailing list