]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: Don't try sparse detection if writing to block device.
authorCole Robinson <crobinso@redhat.com>
Fri, 10 Jul 2009 18:04:27 +0000 (14:04 -0400)
committerCole Robinson <crobinso@redhat.com>
Thu, 16 Jul 2009 16:52:52 +0000 (12:52 -0400)
We don't gain any space savings, so skip the detection to speed up
the cloning operation.

src/storage_backend.c

index bc47bf17a4b29f0aa32a35cf5c9185f08f1a7b87..166480498ba0e5370a79dee9431e1e1c2ea6053f 100644 (file)
@@ -108,7 +108,8 @@ virStorageBackendCopyToFD(virConnectPtr conn,
                           virStorageVolDefPtr vol,
                           virStorageVolDefPtr inputvol,
                           int fd,
-                          unsigned long long *total)
+                          unsigned long long *total,
+                          int is_dest_file)
 {
     int inputfd = -1;
     int amtread = -1;
@@ -157,7 +158,7 @@ virStorageBackendCopyToFD(virConnectPtr conn,
             int interval = ((512 > amtleft) ? amtleft : 512);
             int offset = amtread - amtleft;
 
-            if (memcmp(buf+offset, zerobuf, interval) == 0) {
+            if (is_dest_file && memcmp(buf+offset, zerobuf, interval) == 0) {
                 if (lseek(fd, interval, SEEK_CUR) < 0) {
                     virReportSystemError(conn, errno,
                                          _("cannot extend file '%s'"),
@@ -212,7 +213,8 @@ virStorageBackendCreateBlockFrom(virConnectPtr conn,
     remain = vol->allocation;
 
     if (inputvol) {
-        int res = virStorageBackendCopyToFD(conn, vol, inputvol, fd, &remain);
+        int res = virStorageBackendCopyToFD(conn, vol, inputvol,
+                                            fd, &remain, 0);
         if (res < 0)
             goto cleanup;
     }
@@ -264,7 +266,8 @@ virStorageBackendCreateRaw(virConnectPtr conn,
     remain = vol->allocation;
 
     if (inputvol) {
-        int res = virStorageBackendCopyToFD(conn, vol, inputvol, fd, &remain);
+        int res = virStorageBackendCopyToFD(conn, vol, inputvol,
+                                            fd, &remain, 1);
         if (res < 0)
             goto cleanup;
     }