提交 3d4452a7 编写于 作者: D Daniel P. Berrange

qemu: change qemuDomainTaint APIs to accept qemuDomainLogContextPtr

The qemuDomainTaint APIs currently expect to be passed a log file
descriptor. Change them to instead use a qemuDomainLogContextPtr
to hide the implementation details.
Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
上级 48691750
...@@ -2128,9 +2128,10 @@ qemuDomainDefFormatLive(virQEMUDriverPtr driver, ...@@ -2128,9 +2128,10 @@ qemuDomainDefFormatLive(virQEMUDriverPtr driver,
void qemuDomainObjTaint(virQEMUDriverPtr driver, void qemuDomainObjTaint(virQEMUDriverPtr driver,
virDomainObjPtr obj, virDomainObjPtr obj,
virDomainTaintFlags taint, virDomainTaintFlags taint,
int logFD) qemuDomainLogContextPtr logCtxt)
{ {
virErrorPtr orig_err = NULL; virErrorPtr orig_err = NULL;
bool closeLog = false;
if (virDomainObjTaint(obj, taint)) { if (virDomainObjTaint(obj, taint)) {
char uuidstr[VIR_UUID_STRING_BUFLEN]; char uuidstr[VIR_UUID_STRING_BUFLEN];
...@@ -2146,11 +2147,27 @@ void qemuDomainObjTaint(virQEMUDriverPtr driver, ...@@ -2146,11 +2147,27 @@ void qemuDomainObjTaint(virQEMUDriverPtr driver,
* preserve original error, and clear any error that * preserve original error, and clear any error that
* is raised */ * is raised */
orig_err = virSaveLastError(); orig_err = virSaveLastError();
if (qemuDomainAppendLog(driver, obj, logFD, if (logCtxt == NULL) {
"Domain id=%d is tainted: %s\n", logCtxt = qemuDomainLogContextNew(driver, obj,
obj->def->id, QEMU_DOMAIN_LOG_CONTEXT_MODE_ATTACH);
virDomainTaintTypeToString(taint)) < 0) if (!logCtxt) {
if (orig_err) {
virSetError(orig_err);
virFreeError(orig_err);
}
VIR_WARN("Unable to open domainlog");
return;
}
closeLog = true;
}
if (qemuDomainLogContextWrite(logCtxt,
"Domain id=%d is tainted: %s\n",
obj->def->id,
virDomainTaintTypeToString(taint)) < 0)
virResetLastError(); virResetLastError();
if (closeLog)
qemuDomainLogContextFree(logCtxt);
if (orig_err) { if (orig_err) {
virSetError(orig_err); virSetError(orig_err);
virFreeError(orig_err); virFreeError(orig_err);
...@@ -2161,7 +2178,7 @@ void qemuDomainObjTaint(virQEMUDriverPtr driver, ...@@ -2161,7 +2178,7 @@ void qemuDomainObjTaint(virQEMUDriverPtr driver,
void qemuDomainObjCheckTaint(virQEMUDriverPtr driver, void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
virDomainObjPtr obj, virDomainObjPtr obj,
int logFD) qemuDomainLogContextPtr logCtxt)
{ {
size_t i; size_t i;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
...@@ -2171,32 +2188,32 @@ void qemuDomainObjCheckTaint(virQEMUDriverPtr driver, ...@@ -2171,32 +2188,32 @@ void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
(!cfg->clearEmulatorCapabilities || (!cfg->clearEmulatorCapabilities ||
cfg->user == 0 || cfg->user == 0 ||
cfg->group == 0)) cfg->group == 0))
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HIGH_PRIVILEGES, logFD); qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HIGH_PRIVILEGES, logCtxt);
if (priv->hookRun) if (priv->hookRun)
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HOOK, logFD); qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HOOK, logCtxt);
if (obj->def->namespaceData) { if (obj->def->namespaceData) {
qemuDomainCmdlineDefPtr qemucmd = obj->def->namespaceData; qemuDomainCmdlineDefPtr qemucmd = obj->def->namespaceData;
if (qemucmd->num_args || qemucmd->num_env) if (qemucmd->num_args || qemucmd->num_env)
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CUSTOM_ARGV, logFD); qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CUSTOM_ARGV, logCtxt);
} }
if (obj->def->cpu && obj->def->cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH) if (obj->def->cpu && obj->def->cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH)
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HOST_CPU, logFD); qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HOST_CPU, logCtxt);
for (i = 0; i < obj->def->ndisks; i++) for (i = 0; i < obj->def->ndisks; i++)
qemuDomainObjCheckDiskTaint(driver, obj, obj->def->disks[i], logFD); qemuDomainObjCheckDiskTaint(driver, obj, obj->def->disks[i], logCtxt);
for (i = 0; i < obj->def->nhostdevs; i++) for (i = 0; i < obj->def->nhostdevs; i++)
qemuDomainObjCheckHostdevTaint(driver, obj, obj->def->hostdevs[i], qemuDomainObjCheckHostdevTaint(driver, obj, obj->def->hostdevs[i],
logFD); logCtxt);
for (i = 0; i < obj->def->nnets; i++) for (i = 0; i < obj->def->nnets; i++)
qemuDomainObjCheckNetTaint(driver, obj, obj->def->nets[i], logFD); qemuDomainObjCheckNetTaint(driver, obj, obj->def->nets[i], logCtxt);
if (obj->def->os.dtb) if (obj->def->os.dtb)
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CUSTOM_DTB, logFD); qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CUSTOM_DTB, logCtxt);
virObjectUnref(cfg); virObjectUnref(cfg);
} }
...@@ -2205,24 +2222,24 @@ void qemuDomainObjCheckTaint(virQEMUDriverPtr driver, ...@@ -2205,24 +2222,24 @@ void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver, void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver,
virDomainObjPtr obj, virDomainObjPtr obj,
virDomainDiskDefPtr disk, virDomainDiskDefPtr disk,
int logFD) qemuDomainLogContextPtr logCtxt)
{ {
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
int format = virDomainDiskGetFormat(disk); int format = virDomainDiskGetFormat(disk);
if ((!format || format == VIR_STORAGE_FILE_AUTO) && if ((!format || format == VIR_STORAGE_FILE_AUTO) &&
cfg->allowDiskFormatProbing) cfg->allowDiskFormatProbing)
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_DISK_PROBING, logFD); qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_DISK_PROBING, logCtxt);
if (disk->rawio == VIR_TRISTATE_BOOL_YES) if (disk->rawio == VIR_TRISTATE_BOOL_YES)
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HIGH_PRIVILEGES, qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HIGH_PRIVILEGES,
logFD); logCtxt);
if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM && if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM &&
virStorageSourceGetActualType(disk->src) == VIR_STORAGE_TYPE_BLOCK && virStorageSourceGetActualType(disk->src) == VIR_STORAGE_TYPE_BLOCK &&
disk->src->path) disk->src->path)
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CDROM_PASSTHROUGH, qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CDROM_PASSTHROUGH,
logFD); logCtxt);
virObjectUnref(cfg); virObjectUnref(cfg);
} }
...@@ -2231,21 +2248,21 @@ void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver, ...@@ -2231,21 +2248,21 @@ void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver,
void qemuDomainObjCheckHostdevTaint(virQEMUDriverPtr driver, void qemuDomainObjCheckHostdevTaint(virQEMUDriverPtr driver,
virDomainObjPtr obj, virDomainObjPtr obj,
virDomainHostdevDefPtr hostdev, virDomainHostdevDefPtr hostdev,
int logFD) qemuDomainLogContextPtr logCtxt)
{ {
virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi; virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI && if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
scsisrc->rawio == VIR_TRISTATE_BOOL_YES) scsisrc->rawio == VIR_TRISTATE_BOOL_YES)
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HIGH_PRIVILEGES, qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HIGH_PRIVILEGES,
logFD); logCtxt);
} }
void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver, void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver,
virDomainObjPtr obj, virDomainObjPtr obj,
virDomainNetDefPtr net, virDomainNetDefPtr net,
int logFD) qemuDomainLogContextPtr logCtxt)
{ {
/* script is only useful for NET_TYPE_ETHERNET (qemu) and /* script is only useful for NET_TYPE_ETHERNET (qemu) and
* NET_TYPE_BRIDGE (xen), but could be (incorrectly) specified for * NET_TYPE_BRIDGE (xen), but could be (incorrectly) specified for
...@@ -2253,7 +2270,7 @@ void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver, ...@@ -2253,7 +2270,7 @@ void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver,
* the soup, so it should taint the domain. * the soup, so it should taint the domain.
*/ */
if (net->script != NULL) if (net->script != NULL)
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_SHELL_SCRIPTS, logFD); qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_SHELL_SCRIPTS, logCtxt);
} }
...@@ -2434,45 +2451,6 @@ void qemuDomainLogContextFree(qemuDomainLogContextPtr ctxt) ...@@ -2434,45 +2451,6 @@ void qemuDomainLogContextFree(qemuDomainLogContextPtr ctxt)
} }
int qemuDomainAppendLog(virQEMUDriverPtr driver,
virDomainObjPtr obj,
int logFD,
const char *fmt, ...)
{
va_list argptr;
char *message = NULL;
int ret = -1;
qemuDomainLogContextPtr logCtxt = NULL;
va_start(argptr, fmt);
if (logFD == -1) {
logCtxt = qemuDomainLogContextNew(driver, obj,
QEMU_DOMAIN_LOG_CONTEXT_MODE_ATTACH);
if (!logCtxt)
goto cleanup;
logFD = qemuDomainLogContextGetWriteFD(logCtxt);
}
if (virVasprintf(&message, fmt, argptr) < 0)
goto cleanup;
if (safewrite(logFD, message, strlen(message)) < 0) {
virReportSystemError(errno, _("Unable to write to domain logfile %s"),
obj->def->name);
goto cleanup;
}
ret = 0;
cleanup:
va_end(argptr);
qemuDomainLogContextFree(logCtxt);
VIR_FREE(message);
return ret;
}
/* Locate an appropriate 'qemu-img' binary. */ /* Locate an appropriate 'qemu-img' binary. */
const char * const char *
qemuFindQemuImgBinary(virQEMUDriverPtr driver) qemuFindQemuImgBinary(virQEMUDriverPtr driver)
......
...@@ -334,23 +334,23 @@ char *qemuDomainDefFormatLive(virQEMUDriverPtr driver, ...@@ -334,23 +334,23 @@ char *qemuDomainDefFormatLive(virQEMUDriverPtr driver,
void qemuDomainObjTaint(virQEMUDriverPtr driver, void qemuDomainObjTaint(virQEMUDriverPtr driver,
virDomainObjPtr obj, virDomainObjPtr obj,
virDomainTaintFlags taint, virDomainTaintFlags taint,
int logFD); qemuDomainLogContextPtr logCtxt);
void qemuDomainObjCheckTaint(virQEMUDriverPtr driver, void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
virDomainObjPtr obj, virDomainObjPtr obj,
int logFD); qemuDomainLogContextPtr logCtxt);
void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver, void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver,
virDomainObjPtr obj, virDomainObjPtr obj,
virDomainDiskDefPtr disk, virDomainDiskDefPtr disk,
int logFD); qemuDomainLogContextPtr logCtxt);
void qemuDomainObjCheckHostdevTaint(virQEMUDriverPtr driver, void qemuDomainObjCheckHostdevTaint(virQEMUDriverPtr driver,
virDomainObjPtr obj, virDomainObjPtr obj,
virDomainHostdevDefPtr disk, virDomainHostdevDefPtr disk,
int logFD); qemuDomainLogContextPtr logCtxt);
void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver, void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver,
virDomainObjPtr obj, virDomainObjPtr obj,
virDomainNetDefPtr net, virDomainNetDefPtr net,
int logFD); qemuDomainLogContextPtr logCtxt);
typedef enum { typedef enum {
QEMU_DOMAIN_LOG_CONTEXT_MODE_START, QEMU_DOMAIN_LOG_CONTEXT_MODE_START,
...@@ -372,11 +372,6 @@ off_t qemuDomainLogContextGetPosition(qemuDomainLogContextPtr ctxt); ...@@ -372,11 +372,6 @@ off_t qemuDomainLogContextGetPosition(qemuDomainLogContextPtr ctxt);
void qemuDomainLogContextRef(qemuDomainLogContextPtr ctxt); void qemuDomainLogContextRef(qemuDomainLogContextPtr ctxt);
void qemuDomainLogContextFree(qemuDomainLogContextPtr ctxt); void qemuDomainLogContextFree(qemuDomainLogContextPtr ctxt);
int qemuDomainAppendLog(virQEMUDriverPtr driver,
virDomainObjPtr vm,
int logFD,
const char *fmt, ...) ATTRIBUTE_FMT_PRINTF(4, 5);
const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver); const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver);
int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
......
...@@ -7706,7 +7706,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, ...@@ -7706,7 +7706,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
switch ((virDomainDeviceType) dev->type) { switch ((virDomainDeviceType) dev->type) {
case VIR_DOMAIN_DEVICE_DISK: case VIR_DOMAIN_DEVICE_DISK:
qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk, -1); qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk, NULL);
ret = qemuDomainAttachDeviceDiskLive(dom->conn, driver, vm, dev); ret = qemuDomainAttachDeviceDiskLive(dom->conn, driver, vm, dev);
if (!ret) { if (!ret) {
alias = dev->data.disk->info.alias; alias = dev->data.disk->info.alias;
...@@ -7730,7 +7730,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, ...@@ -7730,7 +7730,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
break; break;
case VIR_DOMAIN_DEVICE_NET: case VIR_DOMAIN_DEVICE_NET:
qemuDomainObjCheckNetTaint(driver, vm, dev->data.net, -1); qemuDomainObjCheckNetTaint(driver, vm, dev->data.net, NULL);
ret = qemuDomainAttachNetDevice(dom->conn, driver, vm, ret = qemuDomainAttachNetDevice(dom->conn, driver, vm,
dev->data.net); dev->data.net);
if (!ret) { if (!ret) {
...@@ -7740,7 +7740,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, ...@@ -7740,7 +7740,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
break; break;
case VIR_DOMAIN_DEVICE_HOSTDEV: case VIR_DOMAIN_DEVICE_HOSTDEV:
qemuDomainObjCheckHostdevTaint(driver, vm, dev->data.hostdev, -1); qemuDomainObjCheckHostdevTaint(driver, vm, dev->data.hostdev, NULL);
ret = qemuDomainAttachHostDevice(dom->conn, driver, vm, ret = qemuDomainAttachHostDevice(dom->conn, driver, vm,
dev->data.hostdev); dev->data.hostdev);
if (!ret) { if (!ret) {
...@@ -7988,7 +7988,7 @@ qemuDomainUpdateDeviceLive(virConnectPtr conn, ...@@ -7988,7 +7988,7 @@ qemuDomainUpdateDeviceLive(virConnectPtr conn,
switch ((virDomainDeviceType) dev->type) { switch ((virDomainDeviceType) dev->type) {
case VIR_DOMAIN_DEVICE_DISK: case VIR_DOMAIN_DEVICE_DISK:
qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk, -1); qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk, NULL);
ret = qemuDomainChangeDiskLive(conn, vm, dev, driver, force); ret = qemuDomainChangeDiskLive(conn, vm, dev, driver, force);
break; break;
case VIR_DOMAIN_DEVICE_GRAPHICS: case VIR_DOMAIN_DEVICE_GRAPHICS:
...@@ -15823,7 +15823,7 @@ static int qemuDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd, ...@@ -15823,7 +15823,7 @@ static int qemuDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd,
priv = vm->privateData; priv = vm->privateData;
qemuDomainObjTaint(driver, vm, VIR_DOMAIN_TAINT_CUSTOM_MONITOR, -1); qemuDomainObjTaint(driver, vm, VIR_DOMAIN_TAINT_CUSTOM_MONITOR, NULL);
hmp = !!(flags & VIR_DOMAIN_QEMU_MONITOR_COMMAND_HMP); hmp = !!(flags & VIR_DOMAIN_QEMU_MONITOR_COMMAND_HMP);
......
...@@ -4780,7 +4780,7 @@ qemuProcessLaunch(virConnectPtr conn, ...@@ -4780,7 +4780,7 @@ qemuProcessLaunch(virConnectPtr conn,
qemuLogOperation(vm, "starting up", logfile, cmd); qemuLogOperation(vm, "starting up", logfile, cmd);
qemuDomainObjCheckTaint(driver, vm, logfile); qemuDomainObjCheckTaint(driver, vm, logCtxt);
qemuDomainLogContextMarkPosition(logCtxt); qemuDomainLogContextMarkPosition(logCtxt);
...@@ -5633,7 +5633,7 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED, ...@@ -5633,7 +5633,7 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
} }
VIR_FREE(timestamp); VIR_FREE(timestamp);
qemuDomainObjTaint(driver, vm, VIR_DOMAIN_TAINT_EXTERNAL_LAUNCH, logfile); qemuDomainObjTaint(driver, vm, VIR_DOMAIN_TAINT_EXTERNAL_LAUNCH, logCtxt);
VIR_DEBUG("Waiting for monitor to show up"); VIR_DEBUG("Waiting for monitor to show up");
if (qemuProcessWaitForMonitor(driver, vm, QEMU_ASYNC_JOB_NONE, priv->qemuCaps, NULL) < 0) if (qemuProcessWaitForMonitor(driver, vm, QEMU_ASYNC_JOB_NONE, priv->qemuCaps, NULL) < 0)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册