From: Peter Krempa <[email protected]>

The 'sparse' uses a mode in qemu which requires direct access to the
file descriptior of the file itself. If we reside on root-squashed NFS
the FD from 'virQEMUFileOpenAs' may not actually be a file which would
not work with qemu.

Reject such a config with a better error message and add documentation
outlining the quirk.

Signed-off-by: Peter Krempa <[email protected]>
---
 src/qemu/qemu_saveimage.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c
index 23922acd51..a3519f8538 100644
--- a/src/qemu/qemu_saveimage.c
+++ b/src/qemu/qemu_saveimage.c
@@ -423,6 +423,20 @@ qemuSaveImageDecompressionStop(virCommand *cmd,
 }


+/**
+ * qemuSaveImageCreateFd:
+ * @vm: domain object
+ * @path: path to the save image file
+ * @wrapperFd: filled with helper structure for the virFileWrapper
+ * @sparse: 'sparse' image format is used for the save image
+ * @needUnlink: if filled with 'true' a new file was created and needs to be
+ *              removed on failure
+ * @bypassCache: Don't use cache for the writes of the save image
+ *
+ * Opens the save image @path and prepares it for saving of the VM state.
+ * Returns a file descriptor on succes. The returned FD is a pipe unless @
+ * sparse is true in which case it's an fd to a file.
+ */
 static int
 qemuSaveImageCreateFd(virDomainObj *vm,
                       const char *path,
@@ -455,6 +469,16 @@ qemuSaveImageCreateFd(virDomainObj *vm,
     if (fd < 0)
         return -1;

+    /* 'virQEMUFileOpenAs' can return a pipe/socket in case when it needs to 
bypass
+     * root-squashed NFS. Since 'sparse' backing format works only with real
+     * files we need to reject such cases */
+    if (sparse && !virFileFDIsRegular(fd)) {
+        virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
+                       _("path '%1$s' can't be opened directly (without the 
use of helper proces) which is incompatible with 'sparse' save image"),
+                       path);
+        return -1;
+    }
+
     if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, 
fd) < 0)
         return -1;

-- 
2.53.0

Reply via email to