diff mbox series

[v5] device: Remove device after all bearers are disconnected

Message ID 20240929022256.3271298-1-quic_chejiang@quicinc.com
State New
Headers show
Series [v5] device: Remove device after all bearers are disconnected | expand

Commit Message

Cheng Jiang (IOE) Sept. 29, 2024, 2:22 a.m. UTC
For a dual-mode remote, both BR/EDR and BLE may be connected,
RemoveDevice should be handled after all bearers are disconnects.
Otherwise, if msg is removed, but not all connection are dropped,
this function returns before *remove is updated, then after all
connections are dropped, but device->disconnects is NULL,
remove_device is not updated. Consequently *remove is not set to
true. Remove device is not performed in adapter_remove_connection.
---
 src/device.c | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

Comments

bluez.test.bot@gmail.com Sept. 29, 2024, 4:07 a.m. UTC | #1
This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=893665

---Test result---

Test Summary:
CheckPatch                    PASS      0.39 seconds
GitLint                       PASS      0.26 seconds
BuildEll                      PASS      24.01 seconds
BluezMake                     PASS      1596.11 seconds
MakeCheck                     PASS      12.94 seconds
MakeDistcheck                 PASS      176.72 seconds
CheckValgrind                 PASS      252.22 seconds
CheckSmatch                   PASS      352.81 seconds
bluezmakeextell               PASS      117.37 seconds
IncrementalBuild              PASS      1490.21 seconds
ScanBuild                     PASS      1024.31 seconds



---
Regards,
Linux Bluetooth
patchwork-bot+bluetooth@kernel.org Sept. 30, 2024, 7:50 p.m. UTC | #2
Hello:

This patch was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:

On Sun, 29 Sep 2024 10:22:56 +0800 you wrote:
> For a dual-mode remote, both BR/EDR and BLE may be connected,
> RemoveDevice should be handled after all bearers are disconnects.
> Otherwise, if msg is removed, but not all connection are dropped,
> this function returns before *remove is updated, then after all
> connections are dropped, but device->disconnects is NULL,
> remove_device is not updated. Consequently *remove is not set to
> true. Remove device is not performed in adapter_remove_connection.
> 
> [...]

Here is the summary with links:
  - [v5] device: Remove device after all bearers are disconnected
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=38734e020513

You are awesome, thank you!
diff mbox series

Patch

diff --git a/src/device.c b/src/device.c
index f8f61e643..7585184de 100644
--- a/src/device.c
+++ b/src/device.c
@@ -3488,18 +3488,6 @@  void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type,
 		device->connect = NULL;
 	}
 
-	while (device->disconnects) {
-		DBusMessage *msg = device->disconnects->data;
-
-		if (dbus_message_is_method_call(msg, ADAPTER_INTERFACE,
-								"RemoveDevice"))
-			remove_device = true;
-
-		g_dbus_send_reply(dbus_conn, msg, DBUS_TYPE_INVALID);
-		device->disconnects = g_slist_remove(device->disconnects, msg);
-		dbus_message_unref(msg);
-	}
-
 	/* Check paired status of both bearers since it's possible to be
 	 * paired but not connected via link key to LTK conversion.
 	 */
@@ -3539,6 +3527,19 @@  void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type,
 	g_dbus_emit_property_changed(dbus_conn, device->path,
 						DEVICE_INTERFACE, "Connected");
 
+	/* remove device only if both bearers are disconnected */
+	while (device->disconnects) {
+		DBusMessage *msg = device->disconnects->data;
+
+		if (dbus_message_is_method_call(msg, ADAPTER_INTERFACE,
+								"RemoveDevice"))
+			remove_device = true;
+
+		g_dbus_send_reply(dbus_conn, msg, DBUS_TYPE_INVALID);
+		device->disconnects = g_slist_remove(device->disconnects, msg);
+		dbus_message_unref(msg);
+	}
+
 	if (remove_device)
 		*remove = remove_device;
 }