Add the RHEL 211.19.1..211.20.1 backports (1245-1287) from centos-stream-10 and upstream, on top of 211.18.1, plus the dpll RHEL kABI adaptation (1287). RHEL now ships the smb cifs.spnego fix too; the existing ahead-fix 1105 is byte-identical, so RHEL's redundant copy is omitted. Bump to 211.20.1.
181 lines
6.0 KiB
Diff
181 lines
6.0 KiB
Diff
From 73744f2131d220b7c5f7571863c45381764f4559 Mon Sep 17 00:00:00 2001
|
|
From: David Marlin <dmarlin@redhat.com>
|
|
Date: Wed, 15 Apr 2026 23:57:05 -0500
|
|
Subject: [PATCH] Bluetooth: hci_sync: hci_cmd_sync_queue_once() return -EEXIST
|
|
if exists
|
|
|
|
JIRA: https://issues.redhat.com/browse/RHEL-157827
|
|
|
|
commit 2969554bcfccb5c609f6b6cd4a014933f3a66dd0
|
|
Author: Pauli Virtanen <pav@iki.fi>
|
|
Date: Wed Mar 25 21:07:43 2026 +0200
|
|
|
|
Bluetooth: hci_sync: hci_cmd_sync_queue_once() return -EEXIST if exists
|
|
|
|
hci_cmd_sync_queue_once() needs to indicate whether a queue item was
|
|
added, so caller can know if callbacks are called, so it can avoid
|
|
leaking resources.
|
|
|
|
Change the function to return -EEXIST if queue item already exists.
|
|
|
|
Modify all callsites to handle that.
|
|
|
|
Signed-off-by: Pauli Virtanen <pav@iki.fi>
|
|
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
|
|
|
|
Conflicts: Context difference due to missing tree-wide changes:
|
|
bf4afc53b77ae Convert 'alloc_obj' family to use the new default GFP_KERNEL argument
|
|
69050f8d6d075 treewide: Replace kmalloc with kmalloc_obj for non-scalar types
|
|
|
|
Signed-off-by: David Marlin <dmarlin@redhat.com>
|
|
|
|
diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
|
|
index 4f7f15544393..6291e1ce61f4 100644
|
|
--- a/net/bluetooth/hci_sync.c
|
|
+++ b/net/bluetooth/hci_sync.c
|
|
@@ -780,7 +780,7 @@ int hci_cmd_sync_queue_once(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
|
|
void *data, hci_cmd_sync_work_destroy_t destroy)
|
|
{
|
|
if (hci_cmd_sync_lookup_entry(hdev, func, data, destroy))
|
|
- return 0;
|
|
+ return -EEXIST;
|
|
|
|
return hci_cmd_sync_queue(hdev, func, data, destroy);
|
|
}
|
|
@@ -3255,6 +3255,8 @@ static int update_passive_scan_sync(struct hci_dev *hdev, void *data)
|
|
|
|
int hci_update_passive_scan(struct hci_dev *hdev)
|
|
{
|
|
+ int err;
|
|
+
|
|
/* Only queue if it would have any effect */
|
|
if (!test_bit(HCI_UP, &hdev->flags) ||
|
|
test_bit(HCI_INIT, &hdev->flags) ||
|
|
@@ -3264,8 +3266,9 @@ int hci_update_passive_scan(struct hci_dev *hdev)
|
|
hci_dev_test_flag(hdev, HCI_UNREGISTER))
|
|
return 0;
|
|
|
|
- return hci_cmd_sync_queue_once(hdev, update_passive_scan_sync, NULL,
|
|
- NULL);
|
|
+ err = hci_cmd_sync_queue_once(hdev, update_passive_scan_sync, NULL,
|
|
+ NULL);
|
|
+ return (err == -EEXIST) ? 0 : err;
|
|
}
|
|
|
|
int hci_write_sc_support_sync(struct hci_dev *hdev, u8 val)
|
|
@@ -6958,8 +6961,11 @@ static int hci_acl_create_conn_sync(struct hci_dev *hdev, void *data)
|
|
|
|
int hci_connect_acl_sync(struct hci_dev *hdev, struct hci_conn *conn)
|
|
{
|
|
- return hci_cmd_sync_queue_once(hdev, hci_acl_create_conn_sync, conn,
|
|
- NULL);
|
|
+ int err;
|
|
+
|
|
+ err = hci_cmd_sync_queue_once(hdev, hci_acl_create_conn_sync, conn,
|
|
+ NULL);
|
|
+ return (err == -EEXIST) ? 0 : err;
|
|
}
|
|
|
|
static void create_le_conn_complete(struct hci_dev *hdev, void *data, int err)
|
|
@@ -6995,8 +7001,11 @@ static void create_le_conn_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
int hci_connect_le_sync(struct hci_dev *hdev, struct hci_conn *conn)
|
|
{
|
|
- return hci_cmd_sync_queue_once(hdev, hci_le_create_conn_sync, conn,
|
|
- create_le_conn_complete);
|
|
+ int err;
|
|
+
|
|
+ err = hci_cmd_sync_queue_once(hdev, hci_le_create_conn_sync, conn,
|
|
+ create_le_conn_complete);
|
|
+ return (err == -EEXIST) ? 0 : err;
|
|
}
|
|
|
|
int hci_cancel_connect_sync(struct hci_dev *hdev, struct hci_conn *conn)
|
|
@@ -7203,8 +7212,11 @@ static int hci_le_pa_create_sync(struct hci_dev *hdev, void *data)
|
|
|
|
int hci_connect_pa_sync(struct hci_dev *hdev, struct hci_conn *conn)
|
|
{
|
|
- return hci_cmd_sync_queue_once(hdev, hci_le_pa_create_sync, conn,
|
|
- create_pa_complete);
|
|
+ int err;
|
|
+
|
|
+ err = hci_cmd_sync_queue_once(hdev, hci_le_pa_create_sync, conn,
|
|
+ create_pa_complete);
|
|
+ return (err == -EEXIST) ? 0 : err;
|
|
}
|
|
|
|
static void create_big_complete(struct hci_dev *hdev, void *data, int err)
|
|
@@ -7266,8 +7278,11 @@ static int hci_le_big_create_sync(struct hci_dev *hdev, void *data)
|
|
|
|
int hci_connect_big_sync(struct hci_dev *hdev, struct hci_conn *conn)
|
|
{
|
|
- return hci_cmd_sync_queue_once(hdev, hci_le_big_create_sync, conn,
|
|
- create_big_complete);
|
|
+ int err;
|
|
+
|
|
+ err = hci_cmd_sync_queue_once(hdev, hci_le_big_create_sync, conn,
|
|
+ create_big_complete);
|
|
+ return (err == -EEXIST) ? 0 : err;
|
|
}
|
|
|
|
struct past_data {
|
|
@@ -7359,7 +7374,7 @@ int hci_past_sync(struct hci_conn *conn, struct hci_conn *le)
|
|
if (err)
|
|
kfree(data);
|
|
|
|
- return err;
|
|
+ return (err == -EEXIST) ? 0 : err;
|
|
}
|
|
|
|
static void le_read_features_complete(struct hci_dev *hdev, void *data, int err)
|
|
@@ -7446,7 +7461,7 @@ int hci_le_read_remote_features(struct hci_conn *conn)
|
|
else
|
|
err = -EOPNOTSUPP;
|
|
|
|
- return err;
|
|
+ return (err == -EEXIST) ? 0 : err;
|
|
}
|
|
|
|
static void pkt_type_changed(struct hci_dev *hdev, void *data, int err)
|
|
@@ -7472,6 +7487,7 @@ int hci_acl_change_pkt_type(struct hci_conn *conn, u16 pkt_type)
|
|
{
|
|
struct hci_dev *hdev = conn->hdev;
|
|
struct hci_cp_change_conn_ptype *cp;
|
|
+ int err;
|
|
|
|
cp = kmalloc(sizeof(*cp), GFP_KERNEL);
|
|
if (!cp)
|
|
@@ -7480,8 +7496,9 @@ int hci_acl_change_pkt_type(struct hci_conn *conn, u16 pkt_type)
|
|
cp->handle = cpu_to_le16(conn->handle);
|
|
cp->pkt_type = cpu_to_le16(pkt_type);
|
|
|
|
- return hci_cmd_sync_queue_once(hdev, hci_change_conn_ptype_sync, cp,
|
|
- pkt_type_changed);
|
|
+ err = hci_cmd_sync_queue_once(hdev, hci_change_conn_ptype_sync, cp,
|
|
+ pkt_type_changed);
|
|
+ return (err == -EEXIST) ? 0 : err;
|
|
}
|
|
|
|
static void le_phy_update_complete(struct hci_dev *hdev, void *data, int err)
|
|
@@ -7507,6 +7524,7 @@ int hci_le_set_phy(struct hci_conn *conn, u8 tx_phys, u8 rx_phys)
|
|
{
|
|
struct hci_dev *hdev = conn->hdev;
|
|
struct hci_cp_le_set_phy *cp;
|
|
+ int err;
|
|
|
|
cp = kmalloc(sizeof(*cp), GFP_KERNEL);
|
|
if (!cp)
|
|
@@ -7517,6 +7535,7 @@ int hci_le_set_phy(struct hci_conn *conn, u8 tx_phys, u8 rx_phys)
|
|
cp->tx_phys = tx_phys;
|
|
cp->rx_phys = rx_phys;
|
|
|
|
- return hci_cmd_sync_queue_once(hdev, hci_le_set_phy_sync, cp,
|
|
- le_phy_update_complete);
|
|
+ err = hci_cmd_sync_queue_once(hdev, hci_le_set_phy_sync, cp,
|
|
+ le_phy_update_complete);
|
|
+ return (err == -EEXIST) ? 0 : err;
|
|
}
|
|
--
|
|
2.50.1 (Apple Git-155)
|
|
|