Signed-off-by: Nikolai Barybin <nikolai.bary...@virtuozzo.com> --- src/conf/domain_conf.c | 64 ++++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 2 ++ src/libvirt_private.syms | 2 ++ 3 files changed, 68 insertions(+)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 99ecb03067..89dceacf79 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -303,6 +303,15 @@ VIR_ENUM_IMPL(virDomainLifecycleAction, "coredump-restart", ); +VIR_ENUM_IMPL(virDomainCoreDumpFormat, + VIR_DOMAIN_CORE_DUMP_FORMAT_LAST, + "raw", + "kdump-zlib", + "kdump-lzo", + "kdump-snappy", + "win-dmp", +); + VIR_ENUM_IMPL(virDomainLockFailure, VIR_DOMAIN_LOCK_FAILURE_LAST, "default", @@ -13820,6 +13829,29 @@ virDomainRedirFilterDefParseXML(xmlNodePtr node, return NULL; } +static int +virDomainCoredumpFormatParseXML(xmlXPathContextPtr ctxt, + const char *name, + const char *xpath, + int *val, + int defaultVal, + virEventActionFromStringFunc convFunc) +{ + g_autofree char *tmp = virXPathString(xpath, ctxt); + + if (tmp == NULL) { + *val = defaultVal; + } else { + *val = convFunc(tmp); + if (*val < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown %1$s format: %2$s"), name, tmp); + return -1; + } + } + return 0; +} + static int virDomainEventActionParseXML(xmlXPathContextPtr ctxt, const char *name, @@ -19163,6 +19195,13 @@ virDomainDefLifecycleParse(virDomainDef *def, virDomainLifecycleActionTypeFromString) < 0) return -1; + if (virDomainCoredumpFormatParseXML(ctxt, "coredump_format", + "string(./coredump_format[1])", + &def->coredumpFormat, + VIR_DOMAIN_CORE_DUMP_FORMAT_RAW, + virDomainCoreDumpFormatTypeFromString) < 0) + return -1; + if (virDomainEventActionParseXML(ctxt, "on_lockfailure", "string(./on_lockfailure[1])", &def->onLockFailure, @@ -22857,6 +22896,25 @@ virDomainEventActionDefFormat(virBuffer *buf, } +static int +virDomainCoreDumpFormatDefFormat(virBuffer *buf, + int type, + const char *name, + virEventActionToStringFunc convFunc) +{ + const char *typeStr = convFunc(type); + if (!typeStr) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected %1$s coredump format: %2$d"), name, type); + return -1; + } + + virBufferAsprintf(buf, "<%s>%s</%s>\n", name, typeStr, name); + + return 0; +} + + static void virSecurityLabelDefFormat(virBuffer *buf, virSecurityLabelDef *def, @@ -29023,6 +29081,12 @@ virDomainDefFormatInternalSetRootName(virDomainDef *def, "on_crash", virDomainLifecycleActionTypeToString) < 0) return -1; + if ((def->onCrash == VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY || + def->onCrash == VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART) && + virDomainCoreDumpFormatDefFormat(buf, def->coredumpFormat, + "coredump_format", + virDomainCoreDumpFormatTypeToString) < 0) + return -1; if (def->onLockFailure != VIR_DOMAIN_LOCK_FAILURE_DEFAULT && virDomainEventActionDefFormat(buf, def->onLockFailure, "on_lockfailure", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0d1dd954ae..6e43282160 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3144,6 +3144,7 @@ struct _virDomainDef { int onReboot; int onPoweroff; int onCrash; + int coredumpFormat; int onLockFailure; /* enum virDomainLockFailureAction */ @@ -4281,6 +4282,7 @@ VIR_ENUM_DECL(virDomainCapabilitiesPolicy); VIR_ENUM_DECL(virDomainProcessCapsFeature); VIR_ENUM_DECL(virDomainLifecycle); VIR_ENUM_DECL(virDomainLifecycleAction); +VIR_ENUM_DECL(virDomainCoreDumpFormat); VIR_ENUM_DECL(virDomainDevice); VIR_ENUM_DECL(virDomainDiskDevice); VIR_ENUM_DECL(virDomainDiskGeometryTrans); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 812fa4e435..72f9e3418f 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -303,6 +303,8 @@ virDomainControllerPCIModelNameTypeFromString; virDomainControllerPCIModelNameTypeToString; virDomainControllerRemove; virDomainControllerTypeToString; +virDomainCoreDumpFormatTypeFromString; +virDomainCoreDumpFormatTypeToString; virDomainCpuPlacementModeTypeFromString; virDomainCpuPlacementModeTypeToString; virDomainCryptoBackendTypeFromString; -- 2.43.5