diff --git a/src/storage_backend.c b/src/storage_backend.c index 188129f94f..bc47bf17a4 100644 --- a/src/storage_backend.c +++ b/src/storage_backend.c @@ -192,6 +192,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, @@ -533,7 +574,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)