#include "viralloc.h"
#include "virstring.h"
+#include "virlog.h"
#define VIR_FROM_THIS VIR_FROM_QEMU
+VIR_LOG_INIT("qemu.qemu_block");
+
/* qemu declares the buffer for node names as a 32 byte array */
static const size_t qemuBlockNodeNameBufSize = 32;
virJSONValueFree(data->storageProps);
virJSONValueFree(data->formatProps);
+ VIR_FREE(data->driveCmd);
+ VIR_FREE(data->driveAlias);
VIR_FREE(data);
}
data->formatAttached = true;
}
+ if (data->driveCmd) {
+ if (qemuMonitorAddDrive(mon, data->driveCmd) < 0)
+ return -1;
+
+ data->driveAdded = true;
+ }
+
return 0;
}
virErrorPreserveLast(&orig_err);
+ if (data->driveAdded) {
+ if (qemuMonitorDriveDel(mon, data->driveAlias) < 0)
+ VIR_WARN("Unable to remove drive %s (%s) after failed "
+ "qemuMonitorAddDevice", data->driveAlias, data->driveCmd);
+ }
+
if (data->formatAttached)
ignore_value(qemuMonitorBlockdevDel(mon, data->formatNodeName));
virJSONValuePtr formatProps;
const char *formatNodeName;
bool formatAttached;
+
+ char *driveCmd;
+ char *driveAlias;
+ bool driveAdded;
};
}
-char *
+static char *
qemuBuildDriveStr(virDomainDiskDefPtr disk,
bool bootable,
virQEMUCapsPtr qemuCaps)
virJSONValueFree(ret);
return NULL;
}
+
+
+/**
+ * qemuBuildStorageSourceAttachPrepareDrive:
+ * @disk: disk object to prepare
+ * @qemuCaps: qemu capabilities object
+ *
+ * Prepare qemuBlockStorageSourceAttachDataPtr for use with the old approach
+ * using -drive/drive_add. See qemuBlockStorageSourceAttachPrepareBlockdev.
+ */
+qemuBlockStorageSourceAttachDataPtr
+qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk,
+ virQEMUCapsPtr qemuCaps)
+{
+ qemuBlockStorageSourceAttachDataPtr data = NULL;
+
+ if (VIR_ALLOC(data) < 0)
+ return NULL;
+
+ if (!(data->driveCmd = qemuBuildDriveStr(disk, false, qemuCaps)) ||
+ !(data->driveAlias = qemuAliasDiskDriveFromDisk(disk))) {
+ qemuBlockStorageSourceAttachDataFree(data);
+ return NULL;
+ }
+
+ return data;
+}
# include "domain_conf.h"
# include "vircommand.h"
# include "capabilities.h"
+# include "qemu_block.h"
# include "qemu_conf.h"
# include "qemu_domain.h"
# include "qemu_domain_address.h"
char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk);
-/* Both legacy & current support */
-char *qemuBuildDriveStr(virDomainDiskDefPtr disk,
- bool bootable,
- virQEMUCapsPtr qemuCaps);
+qemuBlockStorageSourceAttachDataPtr
+qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk,
+ virQEMUCapsPtr qemuCaps);
/* Current, best practice */
char *qemuBuildDriveDevStr(const virDomainDef *def,
#include "qemu_interface.h"
#include "qemu_process.h"
#include "qemu_security.h"
+#include "qemu_block.h"
#include "domain_audit.h"
#include "netdev_bandwidth_conf.h"
#include "domain_nwfilter.h"
{
int ret = -1;
qemuDomainObjPrivatePtr priv = vm->privateData;
+ qemuBlockStorageSourceAttachDataPtr data = NULL;
virErrorPtr orig_err;
char *devstr = NULL;
- char *drivestr = NULL;
- char *drivealias = NULL;
char *unmanagedPrmgrAlias = NULL;
char *managedPrmgrAlias = NULL;
char *encobjAlias = NULL;
char *secobjAlias = NULL;
- bool driveAdded = false;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
virJSONValuePtr secobjProps = NULL;
virJSONValuePtr encobjProps = NULL;
!(unmanagedPrmgrProps = qemuBuildPRManagerInfoProps(disk->src)))
goto error;
- if (disk->src->haveTLS == VIR_TRISTATE_BOOL_YES &&
- qemuDomainAddDiskSrcTLSObject(driver, vm, disk->src) < 0)
- goto error;
-
- if (!(drivestr = qemuBuildDriveStr(disk, false, priv->qemuCaps)))
+ if (!(data = qemuBuildStorageSourceAttachPrepareDrive(disk, priv->qemuCaps)))
goto error;
- if (!(drivealias = qemuAliasDiskDriveFromDisk(disk)))
+ if (disk->src->haveTLS == VIR_TRISTATE_BOOL_YES &&
+ qemuDomainAddDiskSrcTLSObject(driver, vm, disk->src) < 0)
goto error;
if (!(devstr = qemuBuildDriveDevStr(vm->def, disk, 0, priv->qemuCaps)))
qemuMonitorAddObject(priv->mon, &unmanagedPrmgrProps, &unmanagedPrmgrAlias) < 0)
goto exit_monitor;
- if (qemuMonitorAddDrive(priv->mon, drivestr) < 0)
+ if (qemuBlockStorageSourceAttachApply(priv->mon, data) < 0)
goto exit_monitor;
- driveAdded = true;
if (qemuMonitorAddDevice(priv->mon, devstr) < 0)
goto exit_monitor;
ret = 0;
cleanup:
+ qemuBlockStorageSourceAttachDataFree(data);
virJSONValueFree(managedPrmgrProps);
virJSONValueFree(unmanagedPrmgrProps);
virJSONValueFree(encobjProps);
VIR_FREE(unmanagedPrmgrAlias);
VIR_FREE(secobjAlias);
VIR_FREE(encobjAlias);
- VIR_FREE(drivealias);
- VIR_FREE(drivestr);
VIR_FREE(devstr);
virObjectUnref(cfg);
return ret;
exit_monitor:
+ qemuBlockStorageSourceAttachRollback(priv->mon, data);
+
virErrorPreserveLast(&orig_err);
- if (driveAdded && qemuMonitorDriveDel(priv->mon, drivealias) < 0) {
- VIR_WARN("Unable to remove drive %s (%s) after failed "
- "qemuMonitorAddDevice", drivealias, drivestr);
- }
if (secobjAlias)
ignore_value(qemuMonitorDelObject(priv->mon, secobjAlias));
if (encobjAlias)