diff mbox series

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

Message ID 20240929022256.3271298-1-quic_chejiang@quicinc.com (mailing list archive)
State Accepted
Commit 38734e02051364b4b6db6e684beda8c47a1ba452
Headers show
Series [v5] device: Remove device after all bearers are disconnected | expand

Checks

Context Check Description
tedd_an/pre-ci_am success Success
tedd_an/CheckPatch success CheckPatch PASS
tedd_an/GitLint success Gitlint PASS
tedd_an/BuildEll success Build ELL PASS
tedd_an/BluezMake success Bluez Make PASS
tedd_an/MakeCheck success Bluez Make Check PASS
tedd_an/MakeDistcheck success Make Distcheck PASS
tedd_an/CheckValgrind success Check Valgrind PASS
tedd_an/CheckSmatch success CheckSparse PASS
tedd_an/bluezmakeextell success Make External ELL PASS
tedd_an/IncrementalBuild success Incremental Build PASS
tedd_an/ScanBuild success Scan Build PASS

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;
 }