mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-12 07:42:56 +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;
|
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
|
int
|
||||||
virStorageBackendCreateRaw(virConnectPtr conn,
|
virStorageBackendCreateRaw(virConnectPtr conn,
|
||||||
virStorageVolDefPtr vol,
|
virStorageVolDefPtr vol,
|
||||||
@ -533,7 +574,10 @@ virStorageBackendGetBuildVolFromFunction(virConnectPtr conn,
|
|||||||
return virStorageBackendFSImageToolTypeToFunc(conn, tool_type);
|
return virStorageBackendFSImageToolTypeToFunc(conn, tool_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
return virStorageBackendCreateRaw;
|
if (vol->type == VIR_STORAGE_VOL_BLOCK)
|
||||||
|
return virStorageBackendCreateBlockFrom;
|
||||||
|
else
|
||||||
|
return virStorageBackendCreateRaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(UDEVADM) || defined(UDEVSETTLE)
|
#if defined(UDEVADM) || defined(UDEVSETTLE)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user