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

Reply via email to