Re: [Bluez PATCH v2 1/2] plugins/admin: add adapter_remove handler

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks for catching and delivering the fixes.

I didn't consider the multiple adapters case, and I will send out
another patch to fix it.

On Fri, Sep 17, 2021 at 7:50 AM Luiz Augusto von Dentz
<luiz.dentz@xxxxxxxxx> wrote:
>
> Hi Howard,
>
> On Wed, Sep 15, 2021 at 4:40 PM Luiz Augusto von Dentz
> <luiz.dentz@xxxxxxxxx> wrote:
> >
> > Hi Howard,
> >
> > On Wed, Sep 15, 2021 at 5:32 AM Yun-hao Chung <howardchung@xxxxxxxxxx> wrote:
> > >
> > > Gentle ping. Thanks.
> > >
> > >
> > > On Mon, Sep 6, 2021 at 2:03 PM Howard Chung <howardchung@xxxxxxxxxx> wrote:
> > > >
> > > > From: Yun-Hao Chung <howardchung@xxxxxxxxxxxx>
> > > >
> > > > Currently admin doesn't handle adapter removed callbacks, which causes
> > > > interfaces AdminPolicySet1 and AdminPolicyStatus1 not being
> > > > unregistered, which in turns causes these interfaces can not be
> > > > re-registered once adapter is back.
> > > >
> > > > This adds handler for adapter_remove.
> > > >
> > > > Reviewed-by: Shyh-In Hwang <josephsih@xxxxxxxxxxxx>
> > > > Reviewed-by: Miao-chen Chou <mcchou@xxxxxxxxxxxx>
> > > > ---
> > > > tested with following steps
> > > > 1. rmmod btusb
> > > > 2. modprobe btusb
> > > > 3. read allowlist via bluetoothctl
> > > >
> > > > Changes in v2:
> > > > 1. Fix make errors
> > > >
> > > >  plugins/admin.c | 35 ++++++++++++++++++++++++++++-------
> > > >  1 file changed, 28 insertions(+), 7 deletions(-)
> > > >
> > > > diff --git a/plugins/admin.c b/plugins/admin.c
> > > > index 02fec04568ba..82c00cabdb6b 100644
> > > > --- a/plugins/admin.c
> > > > +++ b/plugins/admin.c
> > > > @@ -85,6 +85,17 @@ static void admin_policy_free(void *data)
> > > >         g_free(admin_policy);
> > > >  }
> > > >
> > > > +static void admin_policy_destroy(struct btd_admin_policy *admin_policy)
> > > > +{
> > > > +       const char *path = adapter_get_path(admin_policy->adapter);
> > > > +
> > > > +       g_dbus_unregister_interface(dbus_conn, path,
> > > > +                                               ADMIN_POLICY_SET_INTERFACE);
> > > > +       g_dbus_unregister_interface(dbus_conn, path,
> > > > +                                               ADMIN_POLICY_STATUS_INTERFACE);
> > > > +       admin_policy_free(admin_policy);
> > > > +}
> > > > +
> > > >  static bool uuid_match(const void *data, const void *match_data)
> > > >  {
> > > >         const bt_uuid_t *uuid = data;
> > > > @@ -492,7 +503,7 @@ static int admin_policy_adapter_probe(struct btd_adapter *adapter)
> > > >         if (!g_dbus_register_interface(dbus_conn, adapter_path,
> > > >                                         ADMIN_POLICY_SET_INTERFACE,
> > > >                                         admin_policy_adapter_methods, NULL,
> > > > -                                       NULL, policy_data, admin_policy_free)) {
> > > > +                                       NULL, policy_data, NULL)) {
> > > >                 btd_error(policy_data->adapter_id,
> > > >                         "Admin Policy Set interface init failed on path %s",
> > > >                                                                 adapter_path);
> > > > @@ -506,7 +517,7 @@ static int admin_policy_adapter_probe(struct btd_adapter *adapter)
> > > >                                         ADMIN_POLICY_STATUS_INTERFACE,
> > > >                                         NULL, NULL,
> > > >                                         admin_policy_adapter_properties,
> > > > -                                       policy_data, admin_policy_free)) {
> > > > +                                       policy_data, NULL)) {
> > > >                 btd_error(policy_data->adapter_id,
> > > >                         "Admin Policy Status interface init failed on path %s",
> > > >                                                                 adapter_path);
> > > > @@ -574,10 +585,24 @@ static void admin_policy_device_removed(struct btd_adapter *adapter,
> > > >                 unregister_device_data(data, NULL);
> > > >  }
> > > >
> > > > +static void admin_policy_remove(struct btd_adapter *adapter)
> > > > +{
> > > > +       DBG("");
> > > > +
> > > > +       queue_foreach(devices, unregister_device_data, NULL);
> > > > +       queue_destroy(devices, g_free);
> > > > +
> > > > +       if (policy_data) {
> > > > +               admin_policy_destroy(policy_data);
> > > > +               policy_data = NULL;
> > > > +       }
> > > > +}
> > > > +
> > > >  static struct btd_adapter_driver admin_policy_driver = {
> > > >         .name   = "admin_policy",
> > > >         .probe  = admin_policy_adapter_probe,
> > > >         .resume = NULL,
> > > > +       .remove = admin_policy_remove,
> > > >         .device_resolved = admin_policy_device_added,
> > > >         .device_removed = admin_policy_device_removed
> > > >  };
> > > > @@ -597,11 +622,7 @@ static void admin_exit(void)
> > > >         DBG("");
> > > >
> > > >         btd_unregister_adapter_driver(&admin_policy_driver);
> > > > -       queue_foreach(devices, unregister_device_data, NULL);
> > > > -       queue_destroy(devices, g_free);
> > > > -
> > > > -       if (policy_data)
> > > > -               admin_policy_free(policy_data);
> > > > +       admin_policy_remove(NULL);
> > > >  }
> > > >
> > > >  BLUETOOTH_PLUGIN_DEFINE(admin, VERSION,
> > > > --
> > > > 2.33.0.153.gba50c8fa24-goog
> > > >
> >
> > Applied, thanks.
> >
> >
> > --
>
> There are actually some problems with these admin plugin:
>
> https://patchwork.kernel.org/project/bluetooth/patch/20210916223825.276530-1-luiz.dentz@xxxxxxxxx/
> https://patchwork.kernel.org/project/bluetooth/patch/20210916223825.276530-2-luiz.dentz@xxxxxxxxx/
>
> There is also some assumption that there could be only one
> policy_data, when in fact there could be multiple btd_adapter in the
> system so having admin plugin in a system with multiple adapters might
> lead to various problems.
>
>
> --
> Luiz Augusto von Dentz



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux