From 0c53382d820aac4767895a727c01de23397a6aaa Mon Sep 17 00:00:00 2001 From: Pavel Hrdina Date: Mon, 15 May 2017 15:28:15 +0200 Subject: [PATCH] conf: don't iterate over backcompat console in virDomainChrDefForeach If the first console is just a copy of the first serial device we don't need to iterate over the same device twice in order to perform actions like security labeling, cgroup configuring, etc. Currently only security SELinux manager was aware of this fact. Signed-off-by: Pavel Hrdina --- src/conf/domain_conf.c | 26 +++++++++++++++++++++----- src/security/security_selinux.c | 10 ---------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8c62673398..32234e8a54 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -3523,6 +3523,24 @@ void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info) } +static bool +virDomainSkipBackcompatConsole(virDomainDefPtr def, + size_t index, + bool all) +{ + virDomainChrDefPtr console = def->consoles[index]; + + if (!all && index == 0 && + (console->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL || + console->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_NONE) && + def->os.type == VIR_DOMAIN_OSTYPE_HVM) { + return true; + } + + return false; +} + + static int virDomainDeviceInfoIterateInternal(virDomainDefPtr def, virDomainDeviceInfoCallback cb, @@ -3591,11 +3609,7 @@ virDomainDeviceInfoIterateInternal(virDomainDefPtr def, return -1; } for (i = 0; i < def->nconsoles; i++) { - if (!all && - i == 0 && - (def->consoles[i]->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL || - def->consoles[i]->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_NONE) && - def->os.type == VIR_DOMAIN_OSTYPE_HVM) + if (virDomainSkipBackcompatConsole(def, i, all)) continue; device.data.chr = def->consoles[i]; if (cb(def, &device, &def->consoles[i]->info, opaque) < 0) @@ -25431,6 +25445,8 @@ virDomainChrDefForeach(virDomainDefPtr def, goto done; } for (i = 0; i < def->nconsoles; i++) { + if (virDomainSkipBackcompatConsole(def, i, false)) + continue; if ((iter)(def, def->consoles[i], opaque) < 0) diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c index c7a2dfe982..9504a4be34 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -2323,11 +2323,6 @@ virSecuritySELinuxRestoreSecurityChardevCallback(virDomainDefPtr def, { virSecurityManagerPtr mgr = opaque; - /* This is taken care of by processing of def->serials */ - if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE && - dev->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL) - return 0; - return virSecuritySELinuxRestoreChardevLabel(mgr, def, dev, dev->source); } @@ -2717,11 +2712,6 @@ virSecuritySELinuxSetSecurityChardevCallback(virDomainDefPtr def, { virSecurityManagerPtr mgr = opaque; - /* This is taken care of by processing of def->serials */ - if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE && - dev->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL) - return 0; - return virSecuritySELinuxSetChardevLabel(mgr, def, dev, dev->source); } -- GitLab