[libvirt] [PATCH 6/9] storage: Implement 'CreateBlockFrom' helper.

Cole Robinson crobinso at redhat.com
Fri Jul 10 20:47:03 UTC 2009


Add a 'CreateBlockFrom' in the global storage_backend, which sets up the
destination block device: CopyFromFD does the rest of the cloning.
---
 src/storage_backend.c |   46 +++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 45 insertions(+), 1 deletions(-)

diff --git a/src/storage_backend.c b/src/storage_backend.c
index 868c297..37c227f 100644
--- a/src/storage_backend.c
+++ b/src/storage_backend.c
@@ -190,6 +190,47 @@ cleanup:
     return ret;
 }
 
+static int
+virStorageBackendCreateBlockFrom(virConnectPtr conn,
+                                 virStorageVolDefPtr vol,
+                                 virStorageVolDefPtr inputvol,
+                                 unsigned int flags ATTRIBUTE_UNUSED)
+{
+    int fd = -1;
+    int ret = -1;
+    unsigned long long remain;
+
+    if ((fd = open(vol->target.path, O_RDWR)) < 0) {
+        virReportSystemError(conn, errno,
+                             _("cannot create path '%s'"),
+                             vol->target.path);
+        goto cleanup;
+    }
+
+    remain = vol->allocation;
+
+    if (inputvol) {
+        int res = virStorageBackendCopyToFD(conn, vol, inputvol, fd, &remain);
+        if (res < 0)
+            goto cleanup;
+    }
+
+    if (close(fd) < 0) {
+        virReportSystemError(conn, errno,
+                             _("cannot close file '%s'"),
+                             vol->target.path);
+        goto cleanup;
+    }
+    fd = -1;
+
+    ret = 0;
+cleanup:
+    if (fd != -1)
+        close(fd);
+
+    return ret;
+}
+
 int
 virStorageBackendCreateRaw(virConnectPtr conn,
                            virStorageVolDefPtr vol,
@@ -517,7 +558,10 @@ virStorageBackendGetBuildVolFromFunction(virConnectPtr conn,
         return virStorageBackendFSImageToolTypeToFunc(conn, tool_type);
     }
 
-    return virStorageBackendCreateRaw;
+    if (vol->type == VIR_STORAGE_VOL_BLOCK)
+        return virStorageBackendCreateBlockFrom;
+    else
+        return virStorageBackendCreateRaw;
 }
 
 #if defined(UDEVADM) || defined(UDEVSETTLE)
-- 
1.6.0.6




More information about the libvir-list mailing list