mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 14:45:24 +00:00
storage: Implement 'CreateBlockFrom' helper.
Add a 'CreateBlockFrom' in the global storage_backend, which sets up the destination block device: CopyFromFD does the rest of the cloning.
This commit is contained in:
parent
a256fccfe1
commit
7471357081
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user