| From c45491eba6562dc62dc81d4486589a58e90ce2c0 Mon Sep 17 00:00:00 2001 |
| From: Hans de Goede <hdegoede@redhat.com> |
| Date: Thu, 9 Jul 2020 14:08:51 +0200 |
| Subject: [PATCH] virt: vbox: Fix VBGL_IOCTL_VMMDEV_REQUEST_BIG and _LOG req |
| numbers to match upstream |
| |
| commit f794db6841e5480208f0c3a3ac1df445a96b079e 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 |
| Acked-by: Arnd Bergmann <arnd@arndb.de> |
| Reviewed-by: Arnd Bergmann <arnd@arndb.de> |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Link: https://lore.kernel.org/r/20200709120858.63928-2-hdegoede@redhat.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c |
| index 2307b0329aec..4eb8ea36093a 100644 |
| --- a/drivers/virt/vboxguest/vboxguest_core.c |
| +++ b/drivers/virt/vboxguest/vboxguest_core.c |
| @@ -1519,7 +1519,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) |
| @@ -1557,6 +1558,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 612f0c7d3558..ded39da305d0 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.27.0 |
| |