[PATCH v2 31/38] qemu: Introduce qemuPrepareNVRAMFileCommon()

Andrea Bolognani via Devel posted 38 patches 12 hours ago
[PATCH v2 31/38] qemu: Introduce qemuPrepareNVRAMFileCommon()
Posted by Andrea Bolognani via Devel 12 hours ago
Most of the code in the qemuPrepareNVRAMFile() function can
be reused to create a varstore file from template. Move the
common parts to a generic helper, leaving only the parts
that are NVRAM-specific in the original function.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
---
 src/qemu/qemu_process.c | 56 +++++++++++++++++++++++++++--------------
 1 file changed, 37 insertions(+), 19 deletions(-)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index c5b2a5fda8..997b1d383b 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -4919,45 +4919,40 @@ qemuPrepareNVRAMBlock(virDomainLoaderDef *loader,
 
 
 static int
-qemuPrepareNVRAMFile(virQEMUDriver *driver,
-                     virDomainLoaderDef *loader,
-                     bool reset_nvram)
+qemuPrepareNVRAMFileCommon(virQEMUDriver *driver,
+                           const char *path,
+                           const char *template,
+                           bool reset_nvram)
 {
     g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
     VIR_AUTOCLOSE srcFD = -1;
     struct qemuPrepareNVRAMHelperData data;
 
-    if (virFileExists(loader->nvram->path) && !reset_nvram)
+    if (!path)
         return 0;
 
-    if (!loader->nvramTemplate) {
+    if (virFileExists(path) && !reset_nvram)
+        return 0;
+
+    if (!template) {
         virReportError(VIR_ERR_OPERATION_FAILED,
                        _("unable to find any master var store for loader: %1$s"),
-                       loader->path);
+                       path);
         return -1;
     }
 
-    /* If 'nvramTemplateFormat' is empty it means that it's a user-provided
-     * template which we couldn't verify. Assume the user knows what they're doing */
-    if (loader->nvramTemplateFormat != VIR_STORAGE_FILE_NONE &&
-        loader->nvram->format != loader->nvramTemplateFormat) {
-        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
-                       _("conversion of the nvram template to another target format is not supported"));
-        return -1;
-    }
-
-    if ((srcFD = virFileOpenAs(loader->nvramTemplate, O_RDONLY,
+    if ((srcFD = virFileOpenAs(template, O_RDONLY,
                                0, -1, -1, 0)) < 0) {
         virReportSystemError(-srcFD,
                              _("Failed to open file '%1$s'"),
-                             loader->nvramTemplate);
+                             template);
         return -1;
     }
 
     data.srcFD = srcFD;
-    data.srcPath = loader->nvramTemplate;
+    data.srcPath = template;
 
-    if (virFileRewrite(loader->nvram->path,
+    if (virFileRewrite(path,
                        S_IRUSR | S_IWUSR,
                        cfg->user, cfg->group,
                        qemuPrepareNVRAMHelper,
@@ -4969,6 +4964,29 @@ qemuPrepareNVRAMFile(virQEMUDriver *driver,
 }
 
 
+static int
+qemuPrepareNVRAMFile(virQEMUDriver *driver,
+                     virDomainLoaderDef *loader,
+                     bool reset_nvram)
+{
+    /* If 'nvramTemplateFormat' is empty it means that it's a user-provided
+     * template which we couldn't verify. Assume the user knows what they're doing */
+    if (loader && loader->nvram &&
+        loader->nvramTemplateFormat != VIR_STORAGE_FILE_NONE &&
+        loader->nvram->format != loader->nvramTemplateFormat) {
+        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+                       _("conversion of the nvram template to another target format is not supported"));
+        return -1;
+    }
+
+    if (qemuPrepareNVRAMFileCommon(driver, loader->nvram->path,
+                                   loader->nvramTemplate, reset_nvram) < 0)
+        return -1;
+
+    return 0;
+}
+
+
 int
 qemuPrepareNVRAM(virQEMUDriver *driver,
                  virDomainDef *def,
-- 
2.53.0