124 lines
5.2 KiB
Diff
124 lines
5.2 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Hans de Goede <hdegoede@redhat.com>
|
||
|
Date: Tue, 19 May 2020 12:21:30 +0200
|
||
|
Subject: [PATCH] virt: vbox: Fix VBGL_IOCTL_VMMDEV_REQUEST_BIG and _LOG req
|
||
|
numbers to match upstream
|
||
|
|
||
|
Until this commit the mainline kernel version (this version) of the
|
||
|
vboxguest module contained a bug where it defined
|
||
|
VBGL_IOCTL_VMMDEV_REQUEST_BIG and VBGL_IOCTL_LOG using
|
||
|
_IOC(_IOC_READ | _IOC_WRITE, 'V', ...) instead of
|
||
|
_IO(V, ...) as the out of tree VirtualBox upstream version does.
|
||
|
|
||
|
Since the VirtualBox userspace bits are always built against VirtualBox
|
||
|
upstream's headers, this means that so far the mainline kernel version
|
||
|
of the vboxguest module has been failing these 2 ioctls with -ENOTTY.
|
||
|
I guess that VBGL_IOCTL_VMMDEV_REQUEST_BIG is never used causing us to
|
||
|
not hit that one and sofar the vboxguest driver has failed to actually
|
||
|
log any log messages passed it through VBGL_IOCTL_LOG.
|
||
|
|
||
|
This commit changes the VBGL_IOCTL_VMMDEV_REQUEST_BIG and VBGL_IOCTL_LOG
|
||
|
defines to match the out of tree VirtualBox upstream vboxguest version,
|
||
|
while keeping compatibility with the old wrong request defines so as
|
||
|
to not break the kernel ABI in case someone has been using the old
|
||
|
request defines.
|
||
|
|
||
|
Fixes: f6ddd094f579 ("virt: Add vboxguest driver for Virtual Box Guest integration UAPI")
|
||
|
Cc: stable@vger.kernel.org
|
||
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||
|
Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
|
||
|
---
|
||
|
drivers/virt/vboxguest/vboxguest_core.c | 4 +++-
|
||
|
drivers/virt/vboxguest/vboxguest_core.h | 15 +++++++++++++++
|
||
|
drivers/virt/vboxguest/vboxguest_linux.c | 3 ++-
|
||
|
include/uapi/linux/vboxguest.h | 4 ++--
|
||
|
4 files changed, 22 insertions(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
|
||
|
index b690a8a4bf9e..8fab04e76c14 100644
|
||
|
--- a/drivers/virt/vboxguest/vboxguest_core.c
|
||
|
+++ b/drivers/virt/vboxguest/vboxguest_core.c
|
||
|
@@ -1520,7 +1520,8 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data)
|
||
|
|
||
|
/* For VMMDEV_REQUEST hdr->type != VBG_IOCTL_HDR_TYPE_DEFAULT */
|
||
|
if (req_no_size == VBG_IOCTL_VMMDEV_REQUEST(0) ||
|
||
|
- req == VBG_IOCTL_VMMDEV_REQUEST_BIG)
|
||
|
+ req == VBG_IOCTL_VMMDEV_REQUEST_BIG ||
|
||
|
+ req == VBG_IOCTL_VMMDEV_REQUEST_BIG_ALT)
|
||
|
return vbg_ioctl_vmmrequest(gdev, session, data);
|
||
|
|
||
|
if (hdr->type != VBG_IOCTL_HDR_TYPE_DEFAULT)
|
||
|
@@ -1558,6 +1559,7 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data)
|
||
|
case VBG_IOCTL_HGCM_CALL(0):
|
||
|
return vbg_ioctl_hgcm_call(gdev, session, f32bit, data);
|
||
|
case VBG_IOCTL_LOG(0):
|
||
|
+ case VBG_IOCTL_LOG_ALT(0):
|
||
|
return vbg_ioctl_log(data);
|
||
|
}
|
||
|
|
||
|
diff --git a/drivers/virt/vboxguest/vboxguest_core.h b/drivers/virt/vboxguest/vboxguest_core.h
|
||
|
index 4188c12b839f..77c3a9c8255d 100644
|
||
|
--- a/drivers/virt/vboxguest/vboxguest_core.h
|
||
|
+++ b/drivers/virt/vboxguest/vboxguest_core.h
|
||
|
@@ -15,6 +15,21 @@
|
||
|
#include <linux/vboxguest.h>
|
||
|
#include "vmmdev.h"
|
||
|
|
||
|
+/*
|
||
|
+ * The mainline kernel version (this version) of the vboxguest module
|
||
|
+ * contained a bug where it defined VBGL_IOCTL_VMMDEV_REQUEST_BIG and
|
||
|
+ * VBGL_IOCTL_LOG using _IOC(_IOC_READ | _IOC_WRITE, 'V', ...) instead
|
||
|
+ * of _IO(V, ...) as the out of tree VirtualBox upstream version does.
|
||
|
+ *
|
||
|
+ * These _ALT definitions keep compatibility with the wrong defines the
|
||
|
+ * mainline kernel version used for a while.
|
||
|
+ * Note the VirtualBox userspace bits have always been built against
|
||
|
+ * VirtualBox upstream's headers, so this is likely not necessary. But
|
||
|
+ * we must never break our ABI so we keep these around to be 100% sure.
|
||
|
+ */
|
||
|
+#define VBG_IOCTL_VMMDEV_REQUEST_BIG_ALT _IOC(_IOC_READ | _IOC_WRITE, 'V', 3, 0)
|
||
|
+#define VBG_IOCTL_LOG_ALT(s) _IOC(_IOC_READ | _IOC_WRITE, 'V', 9, s)
|
||
|
+
|
||
|
struct vbg_session;
|
||
|
|
||
|
/** VBox guest memory balloon. */
|
||
|
diff --git a/drivers/virt/vboxguest/vboxguest_linux.c b/drivers/virt/vboxguest/vboxguest_linux.c
|
||
|
index 6e8c0f1c1056..32c2c52f7e84 100644
|
||
|
--- a/drivers/virt/vboxguest/vboxguest_linux.c
|
||
|
+++ b/drivers/virt/vboxguest/vboxguest_linux.c
|
||
|
@@ -131,7 +131,8 @@ static long vbg_misc_device_ioctl(struct file *filp, unsigned int req,
|
||
|
* the need for a bounce-buffer and another copy later on.
|
||
|
*/
|
||
|
is_vmmdev_req = (req & ~IOCSIZE_MASK) == VBG_IOCTL_VMMDEV_REQUEST(0) ||
|
||
|
- req == VBG_IOCTL_VMMDEV_REQUEST_BIG;
|
||
|
+ req == VBG_IOCTL_VMMDEV_REQUEST_BIG ||
|
||
|
+ req == VBG_IOCTL_VMMDEV_REQUEST_BIG_ALT;
|
||
|
|
||
|
if (is_vmmdev_req)
|
||
|
buf = vbg_req_alloc(size, VBG_IOCTL_HDR_TYPE_DEFAULT,
|
||
|
diff --git a/include/uapi/linux/vboxguest.h b/include/uapi/linux/vboxguest.h
|
||
|
index 9cec58a6a5ea..f79d7abe27db 100644
|
||
|
--- a/include/uapi/linux/vboxguest.h
|
||
|
+++ b/include/uapi/linux/vboxguest.h
|
||
|
@@ -103,7 +103,7 @@ VMMDEV_ASSERT_SIZE(vbg_ioctl_driver_version_info, 24 + 20);
|
||
|
|
||
|
|
||
|
/* IOCTL to perform a VMM Device request larger then 1KB. */
|
||
|
-#define VBG_IOCTL_VMMDEV_REQUEST_BIG _IOC(_IOC_READ | _IOC_WRITE, 'V', 3, 0)
|
||
|
+#define VBG_IOCTL_VMMDEV_REQUEST_BIG _IO('V', 3)
|
||
|
|
||
|
|
||
|
/** VBG_IOCTL_HGCM_CONNECT data structure. */
|
||
|
@@ -198,7 +198,7 @@ struct vbg_ioctl_log {
|
||
|
} u;
|
||
|
};
|
||
|
|
||
|
-#define VBG_IOCTL_LOG(s) _IOC(_IOC_READ | _IOC_WRITE, 'V', 9, s)
|
||
|
+#define VBG_IOCTL_LOG(s) _IO('V', 9)
|
||
|
|
||
|
|
||
|
/** VBG_IOCTL_WAIT_FOR_EVENTS data structure. */
|
||
|
--
|
||
|
2.26.2
|
||
|
|