提交 0ed86cfb 编写于 作者: C Cole Robinson

storage: Don't unsparsify images when cloning

Input to the volume cloning code is a source volume and an XML
descriptor for the new volume. It is possible for the new volume
to have a greater size than source volume, at which point libvirt
will just stick 0s on the end of the new image (for raw format
anyways).

Unfortunately a logic error messed up our tracking of the of the
excess amount that needed to be written: end result is that sparse
clones were made very much non-sparse, and cloning regular disk
images could end up excessively sized (though data unaltered).

Drop the 'remain' variable entriely here since it's redundant, and
track actual allocation directly against the desired 'total'.
上级 60f19073
......@@ -127,7 +127,6 @@ virStorageBackendCopyToFD(virStorageVolDefPtr vol,
int inputfd = -1;
int amtread = -1;
int ret = 0;
unsigned long long remain;
size_t rbytes = READ_BLOCK_SIZE_DEFAULT;
size_t wbytes = 0;
int interval;
......@@ -165,13 +164,11 @@ virStorageBackendCopyToFD(virStorageVolDefPtr vol,
goto cleanup;
}
remain = *total;
while (amtread != 0) {
int amtleft;
if (remain < rbytes)
rbytes = remain;
if (*total < rbytes)
rbytes = *total;
if ((amtread = saferead(inputfd, buf, rbytes)) < 0) {
ret = -errno;
......@@ -180,7 +177,7 @@ virStorageBackendCopyToFD(virStorageVolDefPtr vol,
inputvol->target.path);
goto cleanup;
}
remain -= amtread;
*total -= amtread;
/* Loop over amt read in 512 byte increments, looking for sparse
* blocks */
......@@ -225,8 +222,6 @@ virStorageBackendCopyToFD(virStorageVolDefPtr vol,
}
inputfd = -1;
*total -= remain;
cleanup:
VIR_FORCE_CLOSE(inputfd);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册