提交 74713570 编写于 作者: C Cole Robinson

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.
上级 a256fccf
...@@ -192,6 +192,47 @@ cleanup: ...@@ -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, ...@@ -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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册