On Fri, Apr 10, 2015 at 14:59:01 +0200, Ján Tomko wrote:
Do not require the volume definition.
This will allow code reuse when creating snapshots.
---
src/storage/storage_backend.c | 203 +++++++++++++++++++++++-------------------
1 file changed, 109 insertions(+), 94 deletions(-)
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index f5b95ec..bfbc193 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -870,38 +870,16 @@ virStorageBackendCreateQemuImgOpts(char **opts,
return -1;
}
-/* Create a qemu-img virCommand from the supplied binary path,
- * volume definitions and imgformat
- */
-virCommandPtr
-virStorageBackendCreateQemuImgCmdFromVol(virConnectPtr conn,
- virStoragePoolObjPtr pool,
- virStorageVolDefPtr vol,
- virStorageVolDefPtr inputvol,
- unsigned int flags,
- const char *create_tool,
- int imgformat)
+static virCommandPtr
+virStorageBackendCreateQemuImgCmd(const char *create_tool,
+ int imgformat,
+ struct _virStorageBackendQemuImgInfo info)
{
virCommandPtr cmd = NULL;
- const char *type;
+ const char *type = NULL;
const char *backingType = NULL;
const char *inputType = NULL;
char *opts = NULL;
- struct _virStorageBackendQemuImgInfo info = {
- .format = vol->target.format,
- .path = vol->target.path,
- .encryption = vol->target.encryption != NULL,
- .preallocate = !!(flags & VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA),
- .compat = vol->target.compat,
- .features = vol->target.features,
- .nocow = vol->target.nocow,
- };
-
- virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, NULL);
-
- /* Treat output block devices as 'raw' format */
- if (vol->type == VIR_STORAGE_VOL_BLOCK)
- info.format = VIR_STORAGE_FILE_RAW;
if (!(type = virStorageFileFormatTypeToString(info.format))) {
virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -926,6 +904,107 @@ virStorageBackendCreateQemuImgCmdFromVol(virConnectPtr conn,
return NULL;
}
+ if (info.inputPath &&
+ !(inputType = virStorageFileFormatTypeToString(info.inputFormat))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unknown storage vol type %d"),
+ info.inputFormat);
+ return NULL;
+ }
+
+ if (info.backingPath) {
+ if (info.preallocate) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("metadata preallocation conflicts with backing"
+ " store"));
+ return NULL;
+ }
+
+ if (!(backingType = virStorageFileFormatTypeToString(info.backingFormat))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unknown storage vol backing store type %d"),
+ info.backingFormat);
+ return NULL;
+ }
+ }
+
+ /* ignore the backing volume when we're converting a volume */
+ if (info.inputPath) {
+ info.backingPath = NULL;
+ backingType = NULL;
+ }
Shouldn't this go before you bother to check if the backing info is
correct?
+
+ cmd = virCommandNew(create_tool);
+
+ if (info.inputPath)
+ virCommandAddArgList(cmd, "convert", "-f", inputType,
"-O", type, NULL);
+ else
+ virCommandAddArgList(cmd, "create", "-f", type, NULL);
+
+ if (info.backingPath)
+ virCommandAddArgList(cmd, "-b", info.backingPath, NULL);
+
+ if (imgformat >= QEMU_IMG_BACKING_FORMAT_OPTIONS) {
+ if (info.format == VIR_STORAGE_FILE_QCOW2 && !info.compat &&
+ imgformat == QEMU_IMG_BACKING_FORMAT_OPTIONS_COMPAT)
+ info.compat = "0.10";
+
+ if (virStorageBackendCreateQemuImgOpts(&opts, info) < 0) {
+ virCommandFree(cmd);
+ return NULL;
+ }
+ if (opts)
+ virCommandAddArgList(cmd, "-o", opts, NULL);
+ VIR_FREE(opts);
+ } else {
+ if (info.backingPath) {
+ if (imgformat == QEMU_IMG_BACKING_FORMAT_FLAG)
+ virCommandAddArgList(cmd, "-F", backingType, NULL);
+ else
+ VIR_DEBUG("Unable to set backing store format for %s with
%s",
+ info.path, create_tool);
+ }
+ if (info.encryption)
+ virCommandAddArg(cmd, "-e");
+ }
+
+ if (info.inputPath)
+ virCommandAddArg(cmd, info.inputPath);
+ virCommandAddArg(cmd, info.path);
+ if (!info.inputPath && info.size_arg)
+ virCommandAddArgFormat(cmd, "%lluK", info.size_arg);
+ return cmd;
+}
Looks good otherwise.
Peter