summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThorsten Leemhuis <fedora@leemhuis.info>2019-03-21 06:15:31 +0100
committerThorsten Leemhuis <fedora@leemhuis.info>2019-03-21 06:15:31 +0100
commit8d5b91ec4482692b92c9e36eb80fb2d63c21a47e (patch)
tree13aed77d3da52cacd72629a52326128fb33d6953
parent5a86fcc0d12c79876416d21c6cd67859fe770b2a (diff)
parent47ae8ce524c4c0565a7c531d7b32e3ee0b293b2e (diff)
downloadkernel-8d5b91ec4482692b92c9e36eb80fb2d63c21a47e.tar.gz
kernel-8d5b91ec4482692b92c9e36eb80fb2d63c21a47e.tar.xz
kernel-8d5b91ec4482692b92c9e36eb80fb2d63c21a47e.zip
Merge remote-tracking branch 'origin/master' into rawhide-user-thl-vanilla-fedorakernel-5.1.0-0.rc1.git1.1.vanilla.knurd.1.fc28
-rw-r--r--0001-virt-vbox-Implement-passing-requestor-info-to-the-ho.patch663
-rw-r--r--configs/fedora/generic/arm/CONFIG_DWMAC_DWC_QOS_ETH2
-rw-r--r--configs/fedora/generic/arm/aarch64/CONFIG_GPIO_MAX776202
-rw-r--r--configs/fedora/generic/arm/aarch64/CONFIG_PINCTRL_MAX776202
-rw-r--r--configs/fedora/generic/arm/aarch64/CONFIG_REGULATOR_MAX776202
-rw-r--r--gitrev2
-rw-r--r--kernel-aarch64-debug.config8
-rw-r--r--kernel-aarch64.config8
-rw-r--r--kernel-armv7hl-debug.config2
-rw-r--r--kernel-armv7hl-lpae-debug.config2
-rw-r--r--kernel-armv7hl-lpae.config2
-rw-r--r--kernel-armv7hl.config2
-rw-r--r--kernel.spec14
-rw-r--r--sources1
14 files changed, 693 insertions, 19 deletions
diff --git a/0001-virt-vbox-Implement-passing-requestor-info-to-the-ho.patch b/0001-virt-vbox-Implement-passing-requestor-info-to-the-ho.patch
new file mode 100644
index 000000000..27379c45c
--- /dev/null
+++ b/0001-virt-vbox-Implement-passing-requestor-info-to-the-ho.patch
@@ -0,0 +1,663 @@
+From 58b89b03f14fde3b5eda78b9137109b7a860a607 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Tue, 19 Mar 2019 14:05:31 +0100
+Subject: [PATCH] virt: vbox: Implement passing requestor info to the host for
+ VirtualBox 6.0.x
+
+VirtualBox 6.0.x has a new feature where the guest kernel driver passes
+info about the origin of the request (e.g. userspace or kernelspace) to
+the hypervisor.
+
+If we do not pass this information then when running the 6.0.x userspace
+guest-additions tools on a 6.0.x host, some requests will get denied
+with a VERR_VERSION_MISMATCH error, breaking vboxservice.service and
+the mounting of shared folders marked to be auto-mounted.
+
+This commit implements passing the requestor info to the host, fixing this.
+
+Cc: stable@vger.kernel.org
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+---
+ drivers/virt/vboxguest/vboxguest_core.c | 106 ++++++++++++++-------
+ drivers/virt/vboxguest/vboxguest_core.h | 15 +--
+ drivers/virt/vboxguest/vboxguest_linux.c | 26 ++++-
+ drivers/virt/vboxguest/vboxguest_utils.c | 32 ++++---
+ drivers/virt/vboxguest/vboxguest_version.h | 9 +-
+ drivers/virt/vboxguest/vmmdev.h | 8 +-
+ include/linux/vbox_utils.h | 12 ++-
+ include/uapi/linux/vbox_vmmdev_types.h | 31 ++++++
+ 8 files changed, 168 insertions(+), 71 deletions(-)
+
+diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
+index 1475ed5ffcde..2ec5b34ffed7 100644
+--- a/drivers/virt/vboxguest/vboxguest_core.c
++++ b/drivers/virt/vboxguest/vboxguest_core.c
+@@ -27,6 +27,10 @@
+
+ #define GUEST_MAPPINGS_TRIES 5
+
++#define VBG_KERNEL_REQUEST \
++ (VMMDEV_REQUESTOR_KERNEL | VMMDEV_REQUESTOR_USR_DRV | \
++ VMMDEV_REQUESTOR_CON_DONT_KNOW | VMMDEV_REQUESTOR_TRUST_NOT_GIVEN)
++
+ /**
+ * Reserves memory in which the VMM can relocate any guest mappings
+ * that are floating around.
+@@ -48,7 +52,8 @@ static void vbg_guest_mappings_init(struct vbg_dev *gdev)
+ int i, rc;
+
+ /* Query the required space. */
+- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_GET_HYPERVISOR_INFO);
++ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_GET_HYPERVISOR_INFO,
++ VBG_KERNEL_REQUEST);
+ if (!req)
+ return;
+
+@@ -135,7 +140,8 @@ static void vbg_guest_mappings_exit(struct vbg_dev *gdev)
+ * Tell the host that we're going to free the memory we reserved for
+ * it, the free it up. (Leak the memory if anything goes wrong here.)
+ */
+- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_HYPERVISOR_INFO);
++ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_HYPERVISOR_INFO,
++ VBG_KERNEL_REQUEST);
+ if (!req)
+ return;
+
+@@ -172,8 +178,10 @@ static int vbg_report_guest_info(struct vbg_dev *gdev)
+ struct vmmdev_guest_info2 *req2 = NULL;
+ int rc, ret = -ENOMEM;
+
+- req1 = vbg_req_alloc(sizeof(*req1), VMMDEVREQ_REPORT_GUEST_INFO);
+- req2 = vbg_req_alloc(sizeof(*req2), VMMDEVREQ_REPORT_GUEST_INFO2);
++ req1 = vbg_req_alloc(sizeof(*req1), VMMDEVREQ_REPORT_GUEST_INFO,
++ VBG_KERNEL_REQUEST);
++ req2 = vbg_req_alloc(sizeof(*req2), VMMDEVREQ_REPORT_GUEST_INFO2,
++ VBG_KERNEL_REQUEST);
+ if (!req1 || !req2)
+ goto out_free;
+
+@@ -187,8 +195,8 @@ static int vbg_report_guest_info(struct vbg_dev *gdev)
+ req2->additions_minor = VBG_VERSION_MINOR;
+ req2->additions_build = VBG_VERSION_BUILD;
+ req2->additions_revision = VBG_SVN_REV;
+- /* (no features defined yet) */
+- req2->additions_features = 0;
++ req2->additions_features =
++ VMMDEV_GUEST_INFO2_ADDITIONS_FEATURES_REQUESTOR_INFO;
+ strlcpy(req2->name, VBG_VERSION_STRING,
+ sizeof(req2->name));
+
+@@ -230,7 +238,8 @@ static int vbg_report_driver_status(struct vbg_dev *gdev, bool active)
+ struct vmmdev_guest_status *req;
+ int rc;
+
+- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_REPORT_GUEST_STATUS);
++ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_REPORT_GUEST_STATUS,
++ VBG_KERNEL_REQUEST);
+ if (!req)
+ return -ENOMEM;
+
+@@ -423,7 +432,8 @@ static int vbg_heartbeat_host_config(struct vbg_dev *gdev, bool enabled)
+ struct vmmdev_heartbeat *req;
+ int rc;
+
+- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_HEARTBEAT_CONFIGURE);
++ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_HEARTBEAT_CONFIGURE,
++ VBG_KERNEL_REQUEST);
+ if (!req)
+ return -ENOMEM;
+
+@@ -457,7 +467,8 @@ static int vbg_heartbeat_init(struct vbg_dev *gdev)
+
+ gdev->guest_heartbeat_req = vbg_req_alloc(
+ sizeof(*gdev->guest_heartbeat_req),
+- VMMDEVREQ_GUEST_HEARTBEAT);
++ VMMDEVREQ_GUEST_HEARTBEAT,
++ VBG_KERNEL_REQUEST);
+ if (!gdev->guest_heartbeat_req)
+ return -ENOMEM;
+
+@@ -528,7 +539,8 @@ static int vbg_reset_host_event_filter(struct vbg_dev *gdev,
+ struct vmmdev_mask *req;
+ int rc;
+
+- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_CTL_GUEST_FILTER_MASK);
++ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_CTL_GUEST_FILTER_MASK,
++ VBG_KERNEL_REQUEST);
+ if (!req)
+ return -ENOMEM;
+
+@@ -567,8 +579,14 @@ static int vbg_set_session_event_filter(struct vbg_dev *gdev,
+ u32 changed, previous;
+ int rc, ret = 0;
+
+- /* Allocate a request buffer before taking the spinlock */
+- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_CTL_GUEST_FILTER_MASK);
++ /*
++ * Allocate a request buffer before taking the spinlock, when
++ * the session is being terminated the requestor is the kernel,
++ * as we're cleaning up.
++ */
++ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_CTL_GUEST_FILTER_MASK,
++ session_termination ? VBG_KERNEL_REQUEST :
++ session->requestor);
+ if (!req) {
+ if (!session_termination)
+ return -ENOMEM;
+@@ -627,7 +645,8 @@ static int vbg_reset_host_capabilities(struct vbg_dev *gdev)
+ struct vmmdev_mask *req;
+ int rc;
+
+- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES);
++ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES,
++ VBG_KERNEL_REQUEST);
+ if (!req)
+ return -ENOMEM;
+
+@@ -662,8 +681,14 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
+ u32 changed, previous;
+ int rc, ret = 0;
+
+- /* Allocate a request buffer before taking the spinlock */
+- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES);
++ /*
++ * Allocate a request buffer before taking the spinlock, when
++ * the session is being terminated the requestor is the kernel,
++ * as we're cleaning up.
++ */
++ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES,
++ session_termination ? VBG_KERNEL_REQUEST :
++ session->requestor);
+ if (!req) {
+ if (!session_termination)
+ return -ENOMEM;
+@@ -722,7 +747,8 @@ static int vbg_query_host_version(struct vbg_dev *gdev)
+ struct vmmdev_host_version *req;
+ int rc, ret;
+
+- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_GET_HOST_VERSION);
++ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_GET_HOST_VERSION,
++ VBG_KERNEL_REQUEST);
+ if (!req)
+ return -ENOMEM;
+
+@@ -783,19 +809,24 @@ int vbg_core_init(struct vbg_dev *gdev, u32 fixed_events)
+
+ gdev->mem_balloon.get_req =
+ vbg_req_alloc(sizeof(*gdev->mem_balloon.get_req),
+- VMMDEVREQ_GET_MEMBALLOON_CHANGE_REQ);
++ VMMDEVREQ_GET_MEMBALLOON_CHANGE_REQ,
++ VBG_KERNEL_REQUEST);
+ gdev->mem_balloon.change_req =
+ vbg_req_alloc(sizeof(*gdev->mem_balloon.change_req),
+- VMMDEVREQ_CHANGE_MEMBALLOON);
++ VMMDEVREQ_CHANGE_MEMBALLOON,
++ VBG_KERNEL_REQUEST);
+ gdev->cancel_req =
+ vbg_req_alloc(sizeof(*(gdev->cancel_req)),
+- VMMDEVREQ_HGCM_CANCEL2);
++ VMMDEVREQ_HGCM_CANCEL2,
++ VBG_KERNEL_REQUEST);
+ gdev->ack_events_req =
+ vbg_req_alloc(sizeof(*gdev->ack_events_req),
+- VMMDEVREQ_ACKNOWLEDGE_EVENTS);
++ VMMDEVREQ_ACKNOWLEDGE_EVENTS,
++ VBG_KERNEL_REQUEST);
+ gdev->mouse_status_req =
+ vbg_req_alloc(sizeof(*gdev->mouse_status_req),
+- VMMDEVREQ_GET_MOUSE_STATUS);
++ VMMDEVREQ_GET_MOUSE_STATUS,
++ VBG_KERNEL_REQUEST);
+
+ if (!gdev->mem_balloon.get_req || !gdev->mem_balloon.change_req ||
+ !gdev->cancel_req || !gdev->ack_events_req ||
+@@ -892,9 +923,9 @@ void vbg_core_exit(struct vbg_dev *gdev)
+ * vboxguest_linux.c calls this when userspace opens the char-device.
+ * Return: A pointer to the new session or an ERR_PTR on error.
+ * @gdev: The Guest extension device.
+- * @user: Set if this is a session for the vboxuser device.
++ * @requestor: VMMDEV_REQUESTOR_* flags
+ */
+-struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, bool user)
++struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, u32 requestor)
+ {
+ struct vbg_session *session;
+
+@@ -903,7 +934,7 @@ struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, bool user)
+ return ERR_PTR(-ENOMEM);
+
+ session->gdev = gdev;
+- session->user_session = user;
++ session->requestor = requestor;
+
+ return session;
+ }
+@@ -924,7 +955,9 @@ void vbg_core_close_session(struct vbg_session *session)
+ if (!session->hgcm_client_ids[i])
+ continue;
+
+- vbg_hgcm_disconnect(gdev, session->hgcm_client_ids[i], &rc);
++ /* requestor is kernel here, as we're cleaning up. */
++ vbg_hgcm_disconnect(gdev, VBG_KERNEL_REQUEST,
++ session->hgcm_client_ids[i], &rc);
+ }
+
+ kfree(session);
+@@ -1152,7 +1185,8 @@ static int vbg_req_allowed(struct vbg_dev *gdev, struct vbg_session *session,
+ return -EPERM;
+ }
+
+- if (trusted_apps_only && session->user_session) {
++ if (trusted_apps_only &&
++ (session->requestor & VMMDEV_REQUESTOR_USER_DEVICE)) {
+ vbg_err("Denying userspace vmm call type %#08x through vboxuser device node\n",
+ req->request_type);
+ return -EPERM;
+@@ -1209,8 +1243,8 @@ static int vbg_ioctl_hgcm_connect(struct vbg_dev *gdev,
+ if (i >= ARRAY_SIZE(session->hgcm_client_ids))
+ return -EMFILE;
+
+- ret = vbg_hgcm_connect(gdev, &conn->u.in.loc, &client_id,
+- &conn->hdr.rc);
++ ret = vbg_hgcm_connect(gdev, session->requestor, &conn->u.in.loc,
++ &client_id, &conn->hdr.rc);
+
+ mutex_lock(&gdev->session_mutex);
+ if (ret == 0 && conn->hdr.rc >= 0) {
+@@ -1251,7 +1285,8 @@ static int vbg_ioctl_hgcm_disconnect(struct vbg_dev *gdev,
+ if (i >= ARRAY_SIZE(session->hgcm_client_ids))
+ return -EINVAL;
+
+- ret = vbg_hgcm_disconnect(gdev, client_id, &disconn->hdr.rc);
++ ret = vbg_hgcm_disconnect(gdev, session->requestor, client_id,
++ &disconn->hdr.rc);
+
+ mutex_lock(&gdev->session_mutex);
+ if (ret == 0 && disconn->hdr.rc >= 0)
+@@ -1313,12 +1348,12 @@ static int vbg_ioctl_hgcm_call(struct vbg_dev *gdev,
+ }
+
+ if (IS_ENABLED(CONFIG_COMPAT) && f32bit)
+- ret = vbg_hgcm_call32(gdev, client_id,
++ ret = vbg_hgcm_call32(gdev, session->requestor, client_id,
+ call->function, call->timeout_ms,
+ VBG_IOCTL_HGCM_CALL_PARMS32(call),
+ call->parm_count, &call->hdr.rc);
+ else
+- ret = vbg_hgcm_call(gdev, client_id,
++ ret = vbg_hgcm_call(gdev, session->requestor, client_id,
+ call->function, call->timeout_ms,
+ VBG_IOCTL_HGCM_CALL_PARMS(call),
+ call->parm_count, &call->hdr.rc);
+@@ -1408,6 +1443,7 @@ static int vbg_ioctl_check_balloon(struct vbg_dev *gdev,
+ }
+
+ static int vbg_ioctl_write_core_dump(struct vbg_dev *gdev,
++ struct vbg_session *session,
+ struct vbg_ioctl_write_coredump *dump)
+ {
+ struct vmmdev_write_core_dump *req;
+@@ -1415,7 +1451,8 @@ static int vbg_ioctl_write_core_dump(struct vbg_dev *gdev,
+ if (vbg_ioctl_chk(&dump->hdr, sizeof(dump->u.in), 0))
+ return -EINVAL;
+
+- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_WRITE_COREDUMP);
++ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_WRITE_COREDUMP,
++ session->requestor);
+ if (!req)
+ return -ENOMEM;
+
+@@ -1476,7 +1513,7 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data)
+ case VBG_IOCTL_CHECK_BALLOON:
+ return vbg_ioctl_check_balloon(gdev, data);
+ case VBG_IOCTL_WRITE_CORE_DUMP:
+- return vbg_ioctl_write_core_dump(gdev, data);
++ return vbg_ioctl_write_core_dump(gdev, session, data);
+ }
+
+ /* Variable sized requests. */
+@@ -1508,7 +1545,8 @@ int vbg_core_set_mouse_status(struct vbg_dev *gdev, u32 features)
+ struct vmmdev_mouse_status *req;
+ int rc;
+
+- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_MOUSE_STATUS);
++ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_MOUSE_STATUS,
++ VBG_KERNEL_REQUEST);
+ if (!req)
+ return -ENOMEM;
+
+diff --git a/drivers/virt/vboxguest/vboxguest_core.h b/drivers/virt/vboxguest/vboxguest_core.h
+index 7ad9ec45bfa9..4188c12b839f 100644
+--- a/drivers/virt/vboxguest/vboxguest_core.h
++++ b/drivers/virt/vboxguest/vboxguest_core.h
+@@ -154,15 +154,15 @@ struct vbg_session {
+ * host. Protected by vbg_gdev.session_mutex.
+ */
+ u32 guest_caps;
+- /** Does this session belong to a root process or a user one? */
+- bool user_session;
++ /** VMMDEV_REQUESTOR_* flags */
++ u32 requestor;
+ /** Set on CANCEL_ALL_WAITEVENTS, protected by vbg_devevent_spinlock. */
+ bool cancel_waiters;
+ };
+
+ int vbg_core_init(struct vbg_dev *gdev, u32 fixed_events);
+ void vbg_core_exit(struct vbg_dev *gdev);
+-struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, bool user);
++struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, u32 requestor);
+ void vbg_core_close_session(struct vbg_session *session);
+ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data);
+ int vbg_core_set_mouse_status(struct vbg_dev *gdev, u32 features);
+@@ -172,12 +172,13 @@ irqreturn_t vbg_core_isr(int irq, void *dev_id);
+ void vbg_linux_mouse_event(struct vbg_dev *gdev);
+
+ /* Private (non exported) functions form vboxguest_utils.c */
+-void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type);
++void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type,
++ u32 requestor);
+ void vbg_req_free(void *req, size_t len);
+ int vbg_req_perform(struct vbg_dev *gdev, void *req);
+ int vbg_hgcm_call32(
+- struct vbg_dev *gdev, u32 client_id, u32 function, u32 timeout_ms,
+- struct vmmdev_hgcm_function_parameter32 *parm32, u32 parm_count,
+- int *vbox_status);
++ struct vbg_dev *gdev, u32 requestor, u32 client_id, u32 function,
++ u32 timeout_ms, struct vmmdev_hgcm_function_parameter32 *parm32,
++ u32 parm_count, int *vbox_status);
+
+ #endif
+diff --git a/drivers/virt/vboxguest/vboxguest_linux.c b/drivers/virt/vboxguest/vboxguest_linux.c
+index 6e2a9619192d..6e8c0f1c1056 100644
+--- a/drivers/virt/vboxguest/vboxguest_linux.c
++++ b/drivers/virt/vboxguest/vboxguest_linux.c
+@@ -5,6 +5,7 @@
+ * Copyright (C) 2006-2016 Oracle Corporation
+ */
+
++#include <linux/cred.h>
+ #include <linux/input.h>
+ #include <linux/kernel.h>
+ #include <linux/miscdevice.h>
+@@ -28,6 +29,23 @@ static DEFINE_MUTEX(vbg_gdev_mutex);
+ /** Global vbg_gdev pointer used by vbg_get/put_gdev. */
+ static struct vbg_dev *vbg_gdev;
+
++static u32 vbg_misc_device_requestor(struct inode *inode)
++{
++ u32 requestor = VMMDEV_REQUESTOR_USERMODE |
++ VMMDEV_REQUESTOR_CON_DONT_KNOW |
++ VMMDEV_REQUESTOR_TRUST_NOT_GIVEN;
++
++ if (from_kuid(current_user_ns(), current->cred->uid) == 0)
++ requestor |= VMMDEV_REQUESTOR_USR_ROOT;
++ else
++ requestor |= VMMDEV_REQUESTOR_USR_USER;
++
++ if (in_egroup_p(inode->i_gid))
++ requestor |= VMMDEV_REQUESTOR_GRP_VBOX;
++
++ return requestor;
++}
++
+ static int vbg_misc_device_open(struct inode *inode, struct file *filp)
+ {
+ struct vbg_session *session;
+@@ -36,7 +54,7 @@ static int vbg_misc_device_open(struct inode *inode, struct file *filp)
+ /* misc_open sets filp->private_data to our misc device */
+ gdev = container_of(filp->private_data, struct vbg_dev, misc_device);
+
+- session = vbg_core_open_session(gdev, false);
++ session = vbg_core_open_session(gdev, vbg_misc_device_requestor(inode));
+ if (IS_ERR(session))
+ return PTR_ERR(session);
+
+@@ -53,7 +71,8 @@ static int vbg_misc_device_user_open(struct inode *inode, struct file *filp)
+ gdev = container_of(filp->private_data, struct vbg_dev,
+ misc_device_user);
+
+- session = vbg_core_open_session(gdev, false);
++ session = vbg_core_open_session(gdev, vbg_misc_device_requestor(inode) |
++ VMMDEV_REQUESTOR_USER_DEVICE);
+ if (IS_ERR(session))
+ return PTR_ERR(session);
+
+@@ -115,7 +134,8 @@ static long vbg_misc_device_ioctl(struct file *filp, unsigned int req,
+ req == VBG_IOCTL_VMMDEV_REQUEST_BIG;
+
+ if (is_vmmdev_req)
+- buf = vbg_req_alloc(size, VBG_IOCTL_HDR_TYPE_DEFAULT);
++ buf = vbg_req_alloc(size, VBG_IOCTL_HDR_TYPE_DEFAULT,
++ session->requestor);
+ else
+ buf = kmalloc(size, GFP_KERNEL);
+ if (!buf)
+diff --git a/drivers/virt/vboxguest/vboxguest_utils.c b/drivers/virt/vboxguest/vboxguest_utils.c
+index bf4474214b4d..75fd140b02ff 100644
+--- a/drivers/virt/vboxguest/vboxguest_utils.c
++++ b/drivers/virt/vboxguest/vboxguest_utils.c
+@@ -62,7 +62,8 @@ VBG_LOG(vbg_err, pr_err);
+ VBG_LOG(vbg_debug, pr_debug);
+ #endif
+
+-void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type)
++void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type,
++ u32 requestor)
+ {
+ struct vmmdev_request_header *req;
+ int order = get_order(PAGE_ALIGN(len));
+@@ -78,7 +79,7 @@ void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type)
+ req->request_type = req_type;
+ req->rc = VERR_GENERAL_FAILURE;
+ req->reserved1 = 0;
+- req->reserved2 = 0;
++ req->requestor = requestor;
+
+ return req;
+ }
+@@ -119,7 +120,7 @@ static bool hgcm_req_done(struct vbg_dev *gdev,
+ return done;
+ }
+
+-int vbg_hgcm_connect(struct vbg_dev *gdev,
++int vbg_hgcm_connect(struct vbg_dev *gdev, u32 requestor,
+ struct vmmdev_hgcm_service_location *loc,
+ u32 *client_id, int *vbox_status)
+ {
+@@ -127,7 +128,7 @@ int vbg_hgcm_connect(struct vbg_dev *gdev,
+ int rc;
+
+ hgcm_connect = vbg_req_alloc(sizeof(*hgcm_connect),
+- VMMDEVREQ_HGCM_CONNECT);
++ VMMDEVREQ_HGCM_CONNECT, requestor);
+ if (!hgcm_connect)
+ return -ENOMEM;
+
+@@ -153,13 +154,15 @@ int vbg_hgcm_connect(struct vbg_dev *gdev,
+ }
+ EXPORT_SYMBOL(vbg_hgcm_connect);
+
+-int vbg_hgcm_disconnect(struct vbg_dev *gdev, u32 client_id, int *vbox_status)
++int vbg_hgcm_disconnect(struct vbg_dev *gdev, u32 requestor,
++ u32 client_id, int *vbox_status)
+ {
+ struct vmmdev_hgcm_disconnect *hgcm_disconnect = NULL;
+ int rc;
+
+ hgcm_disconnect = vbg_req_alloc(sizeof(*hgcm_disconnect),
+- VMMDEVREQ_HGCM_DISCONNECT);
++ VMMDEVREQ_HGCM_DISCONNECT,
++ requestor);
+ if (!hgcm_disconnect)
+ return -ENOMEM;
+
+@@ -593,9 +596,10 @@ static int hgcm_call_copy_back_result(
+ return 0;
+ }
+
+-int vbg_hgcm_call(struct vbg_dev *gdev, u32 client_id, u32 function,
+- u32 timeout_ms, struct vmmdev_hgcm_function_parameter *parms,
+- u32 parm_count, int *vbox_status)
++int vbg_hgcm_call(struct vbg_dev *gdev, u32 requestor, u32 client_id,
++ u32 function, u32 timeout_ms,
++ struct vmmdev_hgcm_function_parameter *parms, u32 parm_count,
++ int *vbox_status)
+ {
+ struct vmmdev_hgcm_call *call;
+ void **bounce_bufs = NULL;
+@@ -615,7 +619,7 @@ int vbg_hgcm_call(struct vbg_dev *gdev, u32 client_id, u32 function,
+ goto free_bounce_bufs;
+ }
+
+- call = vbg_req_alloc(size, VMMDEVREQ_HGCM_CALL);
++ call = vbg_req_alloc(size, VMMDEVREQ_HGCM_CALL, requestor);
+ if (!call) {
+ ret = -ENOMEM;
+ goto free_bounce_bufs;
+@@ -647,9 +651,9 @@ EXPORT_SYMBOL(vbg_hgcm_call);
+
+ #ifdef CONFIG_COMPAT
+ int vbg_hgcm_call32(
+- struct vbg_dev *gdev, u32 client_id, u32 function, u32 timeout_ms,
+- struct vmmdev_hgcm_function_parameter32 *parm32, u32 parm_count,
+- int *vbox_status)
++ struct vbg_dev *gdev, u32 requestor, u32 client_id, u32 function,
++ u32 timeout_ms, struct vmmdev_hgcm_function_parameter32 *parm32,
++ u32 parm_count, int *vbox_status)
+ {
+ struct vmmdev_hgcm_function_parameter *parm64 = NULL;
+ u32 i, size;
+@@ -689,7 +693,7 @@ int vbg_hgcm_call32(
+ goto out_free;
+ }
+
+- ret = vbg_hgcm_call(gdev, client_id, function, timeout_ms,
++ ret = vbg_hgcm_call(gdev, requestor, client_id, function, timeout_ms,
+ parm64, parm_count, vbox_status);
+ if (ret < 0)
+ goto out_free;
+diff --git a/drivers/virt/vboxguest/vboxguest_version.h b/drivers/virt/vboxguest/vboxguest_version.h
+index 77f0c8f8a231..84834dad38d5 100644
+--- a/drivers/virt/vboxguest/vboxguest_version.h
++++ b/drivers/virt/vboxguest/vboxguest_version.h
+@@ -9,11 +9,10 @@
+ #ifndef __VBOX_VERSION_H__
+ #define __VBOX_VERSION_H__
+
+-/* Last synced October 4th 2017 */
+-#define VBG_VERSION_MAJOR 5
+-#define VBG_VERSION_MINOR 2
++#define VBG_VERSION_MAJOR 6
++#define VBG_VERSION_MINOR 0
+ #define VBG_VERSION_BUILD 0
+-#define VBG_SVN_REV 68940
+-#define VBG_VERSION_STRING "5.2.0"
++#define VBG_SVN_REV 127566
++#define VBG_VERSION_STRING "6.0.0"
+
+ #endif
+diff --git a/drivers/virt/vboxguest/vmmdev.h b/drivers/virt/vboxguest/vmmdev.h
+index 5e2ae978935d..6337b8d75d96 100644
+--- a/drivers/virt/vboxguest/vmmdev.h
++++ b/drivers/virt/vboxguest/vmmdev.h
+@@ -98,8 +98,8 @@ struct vmmdev_request_header {
+ s32 rc;
+ /** Reserved field no.1. MBZ. */
+ u32 reserved1;
+- /** Reserved field no.2. MBZ. */
+- u32 reserved2;
++ /** IN: Requestor information (VMMDEV_REQUESTOR_*) */
++ u32 requestor;
+ };
+ VMMDEV_ASSERT_SIZE(vmmdev_request_header, 24);
+
+@@ -247,6 +247,8 @@ struct vmmdev_guest_info {
+ };
+ VMMDEV_ASSERT_SIZE(vmmdev_guest_info, 24 + 8);
+
++#define VMMDEV_GUEST_INFO2_ADDITIONS_FEATURES_REQUESTOR_INFO BIT(0)
++
+ /** struct vmmdev_guestinfo2 - Guest information report, version 2. */
+ struct vmmdev_guest_info2 {
+ /** Header. */
+@@ -259,7 +261,7 @@ struct vmmdev_guest_info2 {
+ u32 additions_build;
+ /** SVN revision. */
+ u32 additions_revision;
+- /** Feature mask, currently unused. */
++ /** Feature mask. */
+ u32 additions_features;
+ /**
+ * The intentional meaning of this field was:
+diff --git a/include/linux/vbox_utils.h b/include/linux/vbox_utils.h
+index a240ed2a0372..ff56c443180c 100644
+--- a/include/linux/vbox_utils.h
++++ b/include/linux/vbox_utils.h
+@@ -24,15 +24,17 @@ __printf(1, 2) void vbg_debug(const char *fmt, ...);
+ #define vbg_debug pr_debug
+ #endif
+
+-int vbg_hgcm_connect(struct vbg_dev *gdev,
++int vbg_hgcm_connect(struct vbg_dev *gdev, u32 requestor,
+ struct vmmdev_hgcm_service_location *loc,
+ u32 *client_id, int *vbox_status);
+
+-int vbg_hgcm_disconnect(struct vbg_dev *gdev, u32 client_id, int *vbox_status);
++int vbg_hgcm_disconnect(struct vbg_dev *gdev, u32 requestor,
++ u32 client_id, int *vbox_status);
+
+-int vbg_hgcm_call(struct vbg_dev *gdev, u32 client_id, u32 function,
+- u32 timeout_ms, struct vmmdev_hgcm_function_parameter *parms,
+- u32 parm_count, int *vbox_status);
++int vbg_hgcm_call(struct vbg_dev *gdev, u32 requestor, u32 client_id,
++ u32 function, u32 timeout_ms,
++ struct vmmdev_hgcm_function_parameter *parms, u32 parm_count,
++ int *vbox_status);
+
+ /**
+ * Convert a VirtualBox status code to a standard Linux kernel return value.
+diff --git a/include/uapi/linux/vbox_vmmdev_types.h b/include/uapi/linux/vbox_vmmdev_types.h
+index 0e68024f36c7..8c535c2594ad 100644
+--- a/include/uapi/linux/vbox_vmmdev_types.h
++++ b/include/uapi/linux/vbox_vmmdev_types.h
+@@ -102,6 +102,37 @@ enum vmmdev_request_type {
+ #define VMMDEVREQ_HGCM_CALL VMMDEVREQ_HGCM_CALL32
+ #endif
+
++/* vmmdev_request_header.requestor defines */
++
++/* Requestor user not given. */
++#define VMMDEV_REQUESTOR_USR_NOT_GIVEN 0x00000000
++/* The kernel driver (VBoxGuest) is the requestor. */
++#define VMMDEV_REQUESTOR_USR_DRV 0x00000001
++/* Some other kernel driver is the requestor. */
++#define VMMDEV_REQUESTOR_USR_DRV_OTHER 0x00000002
++/* The root or a admin user is the requestor. */
++#define VMMDEV_REQUESTOR_USR_ROOT 0x00000003
++/* Regular joe user is making the request. */
++#define VMMDEV_REQUESTOR_USR_USER 0x00000006
++/* User classification mask. */
++#define VMMDEV_REQUESTOR_USR_MASK 0x00000007
++/* Kernel mode request. */
++#define VMMDEV_REQUESTOR_KERNEL 0x00000000
++/* User mode request. */
++#define VMMDEV_REQUESTOR_USERMODE 0x00000008
++/* Don't know the physical console association of the requestor. */
++#define VMMDEV_REQUESTOR_CON_DONT_KNOW 0x00000000
++/* Console classification mask. */
++#define VMMDEV_REQUESTOR_CON_MASK 0x00000040
++/* Requestor is member of special VirtualBox user group. */
++#define VMMDEV_REQUESTOR_GRP_VBOX 0x00000080
++/* Requestor trust level: Unspecified */
++#define VMMDEV_REQUESTOR_TRUST_NOT_GIVEN 0x00000000
++/* Requestor trust level mask */
++#define VMMDEV_REQUESTOR_TRUST_MASK 0x00007000
++/* Requestor is using the less trusted user device node (/dev/vboxuser) */
++#define VMMDEV_REQUESTOR_USER_DEVICE 0x00008000
++
+ /** HGCM service location types. */
+ enum vmmdev_hgcm_service_location_type {
+ VMMDEV_HGCM_LOC_INVALID = 0,
+--
+2.21.0
+
diff --git a/configs/fedora/generic/arm/CONFIG_DWMAC_DWC_QOS_ETH b/configs/fedora/generic/arm/CONFIG_DWMAC_DWC_QOS_ETH
index 6ed7a8e38..3039e8507 100644
--- a/configs/fedora/generic/arm/CONFIG_DWMAC_DWC_QOS_ETH
+++ b/configs/fedora/generic/arm/CONFIG_DWMAC_DWC_QOS_ETH
@@ -1 +1 @@
-# CONFIG_DWMAC_DWC_QOS_ETH is not set
+CONFIG_DWMAC_DWC_QOS_ETH=m
diff --git a/configs/fedora/generic/arm/aarch64/CONFIG_GPIO_MAX77620 b/configs/fedora/generic/arm/aarch64/CONFIG_GPIO_MAX77620
index fd5e22a31..f084c0667 100644
--- a/configs/fedora/generic/arm/aarch64/CONFIG_GPIO_MAX77620
+++ b/configs/fedora/generic/arm/aarch64/CONFIG_GPIO_MAX77620
@@ -1 +1 @@
-CONFIG_GPIO_MAX77620=m
+CONFIG_GPIO_MAX77620=y
diff --git a/configs/fedora/generic/arm/aarch64/CONFIG_PINCTRL_MAX77620 b/configs/fedora/generic/arm/aarch64/CONFIG_PINCTRL_MAX77620
index 3b44d6941..f98e657d8 100644
--- a/configs/fedora/generic/arm/aarch64/CONFIG_PINCTRL_MAX77620
+++ b/configs/fedora/generic/arm/aarch64/CONFIG_PINCTRL_MAX77620
@@ -1 +1 @@
-CONFIG_PINCTRL_MAX77620=m
+CONFIG_PINCTRL_MAX77620=y
diff --git a/configs/fedora/generic/arm/aarch64/CONFIG_REGULATOR_MAX77620 b/configs/fedora/generic/arm/aarch64/CONFIG_REGULATOR_MAX77620
index db0158399..2101358d4 100644
--- a/configs/fedora/generic/arm/aarch64/CONFIG_REGULATOR_MAX77620
+++ b/configs/fedora/generic/arm/aarch64/CONFIG_REGULATOR_MAX77620
@@ -1 +1 @@
-CONFIG_REGULATOR_MAX77620=m
+CONFIG_REGULATOR_MAX77620=y
diff --git a/gitrev b/gitrev
index cac19f388..e926dc3f3 100644
--- a/gitrev
+++ b/gitrev
@@ -1 +1 @@
-f261c4e529dac5608a604d3dd3ae1cd2adf23c89
+babf09c3837f3cf4b58225225609445419c338e6
diff --git a/kernel-aarch64-debug.config b/kernel-aarch64-debug.config
index 1746eae95..2d9ed7040 100644
--- a/kernel-aarch64-debug.config
+++ b/kernel-aarch64-debug.config
@@ -1596,7 +1596,7 @@ CONFIG_DVB_USB_ZD1301=m
CONFIG_DW_DMAC_CORE=m
CONFIG_DW_DMAC=m
CONFIG_DW_DMAC_PCI=m
-# CONFIG_DWMAC_DWC_QOS_ETH is not set
+CONFIG_DWMAC_DWC_QOS_ETH=m
CONFIG_DWMAC_GENERIC=m
CONFIG_DWMAC_IPQ806X=m
CONFIG_DWMAC_MESON=m
@@ -1939,7 +1939,7 @@ CONFIG_GPIOLIB=y
# CONFIG_GPIO_MAX7300 is not set
# CONFIG_GPIO_MAX7301 is not set
# CONFIG_GPIO_MAX732X is not set
-CONFIG_GPIO_MAX77620=m
+CONFIG_GPIO_MAX77620=y
CONFIG_GPIO_MB86S7X=m
# CONFIG_GPIO_MC33880 is not set
# CONFIG_GPIO_MOCKUP is not set
@@ -4395,7 +4395,7 @@ CONFIG_PINCTRL_CEDARFORK=m
# CONFIG_PINCTRL_IPQ4019 is not set
# CONFIG_PINCTRL_IPQ8064 is not set
# CONFIG_PINCTRL_IPQ8074 is not set
-CONFIG_PINCTRL_MAX77620=m
+CONFIG_PINCTRL_MAX77620=y
# CONFIG_PINCTRL_MCP23S08 is not set
# CONFIG_PINCTRL_MDM9615 is not set
# CONFIG_PINCTRL_MESON8B is not set
@@ -4744,7 +4744,7 @@ CONFIG_REGULATOR_HI655X=m
# CONFIG_REGULATOR_LTC3589 is not set
# CONFIG_REGULATOR_LTC3676 is not set
# CONFIG_REGULATOR_MAX1586 is not set
-CONFIG_REGULATOR_MAX77620=m
+CONFIG_REGULATOR_MAX77620=y
CONFIG_REGULATOR_MAX77686=m
CONFIG_REGULATOR_MAX77802=m
# CONFIG_REGULATOR_MAX8649 is not set
diff --git a/kernel-aarch64.config b/kernel-aarch64.config
index 6c9684769..2e722ab88 100644
--- a/kernel-aarch64.config
+++ b/kernel-aarch64.config
@@ -1588,7 +1588,7 @@ CONFIG_DVB_USB_ZD1301=m
CONFIG_DW_DMAC_CORE=m
CONFIG_DW_DMAC=m
CONFIG_DW_DMAC_PCI=m
-# CONFIG_DWMAC_DWC_QOS_ETH is not set
+CONFIG_DWMAC_DWC_QOS_ETH=m
CONFIG_DWMAC_GENERIC=m
CONFIG_DWMAC_IPQ806X=m
CONFIG_DWMAC_MESON=m
@@ -1923,7 +1923,7 @@ CONFIG_GPIOLIB=y
# CONFIG_GPIO_MAX7300 is not set
# CONFIG_GPIO_MAX7301 is not set
# CONFIG_GPIO_MAX732X is not set
-CONFIG_GPIO_MAX77620=m
+CONFIG_GPIO_MAX77620=y
CONFIG_GPIO_MB86S7X=m
# CONFIG_GPIO_MC33880 is not set
# CONFIG_GPIO_MOCKUP is not set
@@ -4375,7 +4375,7 @@ CONFIG_PINCTRL_CEDARFORK=m
# CONFIG_PINCTRL_IPQ4019 is not set
# CONFIG_PINCTRL_IPQ8064 is not set
# CONFIG_PINCTRL_IPQ8074 is not set
-CONFIG_PINCTRL_MAX77620=m
+CONFIG_PINCTRL_MAX77620=y
# CONFIG_PINCTRL_MCP23S08 is not set
# CONFIG_PINCTRL_MDM9615 is not set
# CONFIG_PINCTRL_MESON8B is not set
@@ -4723,7 +4723,7 @@ CONFIG_REGULATOR_HI655X=m
# CONFIG_REGULATOR_LTC3589 is not set
# CONFIG_REGULATOR_LTC3676 is not set
# CONFIG_REGULATOR_MAX1586 is not set
-CONFIG_REGULATOR_MAX77620=m
+CONFIG_REGULATOR_MAX77620=y
CONFIG_REGULATOR_MAX77686=m
CONFIG_REGULATOR_MAX77802=m
# CONFIG_REGULATOR_MAX8649 is not set
diff --git a/kernel-armv7hl-debug.config b/kernel-armv7hl-debug.config
index 51ec4d1f8..779416ae0 100644
--- a/kernel-armv7hl-debug.config
+++ b/kernel-armv7hl-debug.config
@@ -1643,7 +1643,7 @@ CONFIG_DVB_USB_ZD1301=m
CONFIG_DW_DMAC_CORE=m
CONFIG_DW_DMAC=m
CONFIG_DW_DMAC_PCI=m
-# CONFIG_DWMAC_DWC_QOS_ETH is not set
+CONFIG_DWMAC_DWC_QOS_ETH=m
CONFIG_DWMAC_GENERIC=m
CONFIG_DWMAC_IPQ806X=m
CONFIG_DWMAC_MESON=m
diff --git a/kernel-armv7hl-lpae-debug.config b/kernel-armv7hl-lpae-debug.config
index 33c2d4d29..25d592b93 100644
--- a/kernel-armv7hl-lpae-debug.config
+++ b/kernel-armv7hl-lpae-debug.config
@@ -1571,7 +1571,7 @@ CONFIG_DVB_USB_ZD1301=m
CONFIG_DW_DMAC_CORE=m
CONFIG_DW_DMAC=m
CONFIG_DW_DMAC_PCI=m
-# CONFIG_DWMAC_DWC_QOS_ETH is not set
+CONFIG_DWMAC_DWC_QOS_ETH=m
CONFIG_DWMAC_GENERIC=m
CONFIG_DWMAC_MESON=m
CONFIG_DWMAC_ROCKCHIP=m
diff --git a/kernel-armv7hl-lpae.config b/kernel-armv7hl-lpae.config
index 783532a9a..bc3f66676 100644
--- a/kernel-armv7hl-lpae.config
+++ b/kernel-armv7hl-lpae.config
@@ -1564,7 +1564,7 @@ CONFIG_DVB_USB_ZD1301=m
CONFIG_DW_DMAC_CORE=m
CONFIG_DW_DMAC=m
CONFIG_DW_DMAC_PCI=m
-# CONFIG_DWMAC_DWC_QOS_ETH is not set
+CONFIG_DWMAC_DWC_QOS_ETH=m
CONFIG_DWMAC_GENERIC=m
CONFIG_DWMAC_MESON=m
CONFIG_DWMAC_ROCKCHIP=m
diff --git a/kernel-armv7hl.config b/kernel-armv7hl.config
index 0bd7d82b9..3ece3890c 100644
--- a/kernel-armv7hl.config
+++ b/kernel-armv7hl.config
@@ -1636,7 +1636,7 @@ CONFIG_DVB_USB_ZD1301=m
CONFIG_DW_DMAC_CORE=m
CONFIG_DW_DMAC=m
CONFIG_DW_DMAC_PCI=m
-# CONFIG_DWMAC_DWC_QOS_ETH is not set
+CONFIG_DWMAC_DWC_QOS_ETH=m
CONFIG_DWMAC_GENERIC=m
CONFIG_DWMAC_IPQ806X=m
CONFIG_DWMAC_MESON=m
diff --git a/kernel.spec b/kernel.spec
index 55b9625f1..a3c3baf19 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -77,7 +77,7 @@ Summary: The Linux kernel
# The rc snapshot level
%global rcrev 1
# The git snapshot level
-%define gitrev 0
+%define gitrev 1
# Set rpm version accordingly
%define rpmversion 5.%{upstream_sublevel}.0
%endif
@@ -130,7 +130,7 @@ Summary: The Linux kernel
# Set debugbuildsenabled to 1 for production (build separate debug kernels)
# and 0 for rawhide (all kernels are debug kernels).
# See also 'make debug' and 'make release'.
-%define debugbuildsenabled 1
+%define debugbuildsenabled 0
# Kernel headers are being split out into a separate package
%if 0%{?fedora}
@@ -596,6 +596,9 @@ Patch501: input-rmi4-remove-the-need-for-artifical-IRQ.patch
Patch506: 0001-s390-jump_label-Correct-asm-contraint.patch
Patch507: 0001-Drop-that-for-now.patch
+# rhbz 1689750, patch submitted upstream
+Patch508: 0001-virt-vbox-Implement-passing-requestor-info-to-the-ho.patch
+
# END OF PATCH DEFINITIONS
%endif
@@ -1872,6 +1875,13 @@ fi
#
#
%changelog
+* Wed Mar 20 2019 Jeremy Cline <jcline@redhat.com> - 5.1.0-0.rc1.git1.1
+- Linux v5.1-rc1-15-gbabf09c3837f
+- Reenable debugging options.
+
+* Wed Mar 20 2019 Hans de Goede <hdegoede@redhat.com>
+- Make the mainline vboxguest drv feature set match VirtualBox 6.0.x (#1689750)
+
* Mon Mar 18 2019 Jeremy Cline <jcline@redhat.com> - 5.1.0-0.rc1.git0.1
- Linux v5.1-rc1
diff --git a/sources b/sources
index 17ff4c626..a8e6b8da6 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,3 @@
SHA512 (linux-5.0.tar.xz) = 3fbab70c7b03b1a10e9fa14d1e2e1f550faba4f5792b7699ca006951da74ab86e7d7f19c6a67849ab99343186e7d6f2752cd910d76222213b93c1eab90abf1b0
SHA512 (patch-5.1-rc1.xz) = 013b5354de22870555cf604d756acb0ab90e4383c59e11671611a6dbd88de8cca4ca4727a428e5aa563b6aad66aad01539eee0d9adb594c58d18edffe3f2e82e
+SHA512 (patch-5.1-rc1-git1.xz) = fa2716c6490ec4da20064772f48e7e256d2d355d571b2f26ef11a140a4615e239169ad9bfb830985d5841d0708c47af6b40e907dd44d8e0535f69dcb43e2af99