public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
* [bluez/bluez] 550632: src/device: Fix stored gatt cache DB Hash value no...
@ 2026-04-01 12:10 MengshiWu-mengshiw
  0 siblings, 0 replies; only message in thread
From: MengshiWu-mengshiw @ 2026-04-01 12:10 UTC (permalink / raw)
  To: linux-bluetooth

  Branch: refs/heads/1075787
  Home:   https://github.com/bluez/bluez
  Commit: 550632cf75f4c0e2867041746f96f03225b2777d
      https://github.com/bluez/bluez/commit/550632cf75f4c0e2867041746f96f03225b2777d
  Author: Mengshi Wu <mengshi.wu@oss.qualcomm.com>
  Date:   2026-04-01 (Wed, 01 Apr 2026)

  Changed paths:
    M src/device.c

  Log Message:
  -----------
  src/device: Fix stored gatt cache DB Hash value not update

There is an asymmetry in behavior: when services are added during
the same connection (via Service Changed indication), the persistent
storage (disk) is not updated with the new DB hash, but when services
are removed, it is updated.

During the same connection, We check DB hash value stored at
/var/lib/bluetooth/<adaptor addr>/cache/<remote addr>.
When established connection, the stored DB Hash value is A.Then we
add new services, the stored DB Hash value is still A which should
change to B. However, if we remove the existing services, the stored
DB Hash value changed to C.

When performing addition, it goes like this:

discover_primary_cb()
  └─> gatt_db_insert_service()      ← NEW service inserted into db
        └─> gatt_service_added()    ← callback fires immediately
              └─> store_gatt_db()   ← SAVED TO DISK (hash still OLD)
  ...
  └─> discovery_op_complete(success=true)
        └─> read_db_hash(op)             ← sends ATT Read By Type
              └─> [ATT response arrives]
                    └─> db_hash_read_cb()
                          ├─> gatt_db_attribute_write(op->hash, ...)
                          │     └─> hash UPDATED IN MEMORY
                          └─> discovery_op_complete(true, 0)
                                ├─> [no services to remove, no
                                │    store_gatt_db called]
                                └─> service_changed_complete()

Whereas removal perform like this:
discovery_op_complete(success=true)  [1st call]
  └─> read_db_hash(op)
      └─> op->hash is NULL → sends ATT request → early return
...
[ATT response arrives]
db_hash_read_cb()
  └─> gatt_db_attribute_write(op->hash, ) ← hash UPDATED IN MEMORY
  └─> discovery_op_complete(true, 0)          [2nd call]
      └─> read_db_hash(op)  → op->hash already set → returns false
      └─> gatt_db_remove_service()
          └─> gatt_service_removed()
              └─> store_gatt_db() ← SAVED TO DISK (hash is NEW)

There is a timing issue to update DB Hash value.

The gatt_client_service_changed() callback in src/device.c is called
from service_changed_complete() in gatt-client.c, which is invoked
after db_hash_read_cb() has already updated the hash. Adding
store_gatt_db(device) here guarantees the db is persisted with the
correct, up-to-date hash for both the addition and removal cases.

Signed-off-by: Mengshi Wu <mengshi.wu@oss.qualcomm.com>



To unsubscribe from these emails, change your notification settings at https://github.com/bluez/bluez/settings/notifications

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2026-04-01 12:10 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-01 12:10 [bluez/bluez] 550632: src/device: Fix stored gatt cache DB Hash value no MengshiWu-mengshiw

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox