Blob Blame History Raw
From 857c1d4204235ba304fe4e089a9aa9dbf4ef047e Mon Sep 17 00:00:00 2001
From: Oliver Neukum <oneukum@suse.com>
Date: Mon, 14 Mar 2022 15:12:45 +0100
Subject: [PATCH] kABI: fix rndis_parameters locking
Patch-mainline: Never (kABI fixup)
References: git-fixes

We cannot add a lock to an embedded structure.
Use a global lock.

Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
 drivers/usb/gadget/function/rndis.c |   16 ++++++++--------
 drivers/usb/gadget/function/rndis.h |    1 -
 2 files changed, 8 insertions(+), 9 deletions(-)

--- a/drivers/usb/gadget/function/rndis.c
+++ b/drivers/usb/gadget/function/rndis.c
@@ -55,6 +55,7 @@ MODULE_PARM_DESC (rndis_debug, "enable d
 #define rndis_debug		0
 #endif
 
+static DEFINE_SPINLOCK(suse_rndis_params_lock);
 #ifdef CONFIG_USB_GADGET_DEBUG_FILES
 
 #define	NAME_TEMPLATE "driver/rndis-%03d"
@@ -922,7 +923,6 @@ struct rndis_params *rndis_register(void
 	params->resp_avail = resp_avail;
 	params->v = v;
 	INIT_LIST_HEAD(&params->resp_queue);
-	spin_lock_init(&params->resp_lock);
 	pr_debug("%s: configNr = %d\n", __func__, i);
 
 	return params;
@@ -1016,14 +1016,14 @@ void rndis_free_response(struct rndis_pa
 {
 	rndis_resp_t *r, *n;
 
-	spin_lock(&params->resp_lock);
+	spin_lock(&suse_rndis_params_lock);
 	list_for_each_entry_safe(r, n, &params->resp_queue, list) {
 		if (r->buf == buf) {
 			list_del(&r->list);
 			kfree(r);
 		}
 	}
-	spin_unlock(&params->resp_lock);
+	spin_unlock(&suse_rndis_params_lock);
 }
 EXPORT_SYMBOL_GPL(rndis_free_response);
 
@@ -1033,17 +1033,17 @@ u8 *rndis_get_next_response(struct rndis
 
 	if (!length) return NULL;
 
-	spin_lock(&params->resp_lock);
+	spin_lock(&suse_rndis_params_lock);
 	list_for_each_entry_safe(r, n, &params->resp_queue, list) {
 		if (!r->send) {
 			r->send = 1;
 			*length = r->length;
-			spin_unlock(&params->resp_lock);
+			spin_unlock(&suse_rndis_params_lock);
 			return r->buf;
 		}
 	}
 
-	spin_unlock(&params->resp_lock);
+	spin_unlock(&suse_rndis_params_lock);
 	return NULL;
 }
 EXPORT_SYMBOL_GPL(rndis_get_next_response);
@@ -1060,9 +1060,9 @@ static rndis_resp_t *rndis_add_response(
 	r->length = length;
 	r->send = 0;
 
-	spin_lock(&params->resp_lock);
+	spin_lock(&suse_rndis_params_lock);
 	list_add_tail(&r->list, &params->resp_queue);
-	spin_unlock(&params->resp_lock);
+	spin_unlock(&suse_rndis_params_lock);
 	return r;
 }
 
--- a/drivers/usb/gadget/function/rndis.h
+++ b/drivers/usb/gadget/function/rndis.h
@@ -174,7 +174,6 @@ typedef struct rndis_params {
 	void			(*resp_avail)(void *v);
 	void			*v;
 	struct list_head	resp_queue;
-	spinlock_t		resp_lock;
 } rndis_params;
 
 /* RNDIS Message parser and other useless functions */