* [PATCH] Fix unloading of adapter drivers
@ 2011-03-10 12:10 Szymon Janc
2011-03-10 13:42 ` Johan Hedberg
0 siblings, 1 reply; 5+ messages in thread
From: Szymon Janc @ 2011-03-10 12:10 UTC (permalink / raw)
To: linux-bluetooth; +Cc: par-gunnar.p.hjalmdahl, henrik.possung, Szymon Janc
Call driver remove callback only if corresponding probe succeed.
---
src/adapter.c | 41 +++++++++++++++++++++++++----------------
1 files changed, 25 insertions(+), 16 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index b119fd1..c72017b 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -144,6 +144,8 @@ struct btd_adapter {
GSList *powered_callbacks;
gboolean name_stored;
+
+ GSList *loaded_drivers;
};
static void adapter_set_pairable_timeout(struct btd_adapter *adapter,
@@ -2246,23 +2248,26 @@ static void probe_driver(struct btd_adapter *adapter, gpointer user_data)
if (!adapter->up)
return;
+ if (driver->probe == NULL)
+ return;
+
err = driver->probe(adapter);
- if (err < 0)
+
+ if (err < 0) {
error("%s: %s (%d)", driver->name, strerror(-err), -err);
+ return;
+ }
+
+ adapter->loaded_drivers = g_slist_prepend(adapter->loaded_drivers,
+ driver);
}
static void load_drivers(struct btd_adapter *adapter)
{
GSList *l;
- for (l = adapter_drivers; l; l = l->next) {
- struct btd_adapter_driver *driver = l->data;
-
- if (driver->probe == NULL)
- continue;
-
- probe_driver(adapter, driver);
- }
+ for (l = adapter_drivers; l; l = l->next)
+ probe_driver(adapter, l->data);
}
static void load_connections(struct btd_adapter *adapter)
@@ -2477,16 +2482,20 @@ static void reply_pending_requests(struct btd_adapter *adapter)
}
}
-static void unload_drivers(struct btd_adapter *adapter)
+
+static void remove_driver(gpointer data, gpointer user_data)
{
- GSList *l;
+ struct btd_adapter_driver *driver = data;
+ struct btd_adapter *adapter = user_data;
- for (l = adapter_drivers; l; l = l->next) {
- struct btd_adapter_driver *driver = l->data;
+ if (driver->remove)
+ driver->remove(adapter);
+}
- if (driver->remove)
- driver->remove(adapter);
- }
+static void unload_drivers(struct btd_adapter *adapter)
+{
+ g_slist_foreach(adapter->loaded_drivers, remove_driver, adapter);
+ g_slist_free(adapter->loaded_drivers);
}
static void set_mode_complete(struct btd_adapter *adapter)
--
1.7.0.4
on behalf of ST-Ericsson
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] Fix unloading of adapter drivers
2011-03-10 12:10 [PATCH] Fix unloading of adapter drivers Szymon Janc
@ 2011-03-10 13:42 ` Johan Hedberg
2011-03-10 14:16 ` Szymon Janc
0 siblings, 1 reply; 5+ messages in thread
From: Johan Hedberg @ 2011-03-10 13:42 UTC (permalink / raw)
To: Szymon Janc; +Cc: linux-bluetooth, par-gunnar.p.hjalmdahl, henrik.possung
Hi Szymon,
On Thu, Mar 10, 2011, Szymon Janc wrote:
> Call driver remove callback only if corresponding probe succeed.
> ---
> src/adapter.c | 41 +++++++++++++++++++++++++----------------
> 1 files changed, 25 insertions(+), 16 deletions(-)
The patch looks ok'ish, but don't you have to update the
btd_unregister_adapter_driver function too? (so it also removes
potential entries in the loaded_drivers list)
Johan
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Fix unloading of adapter drivers
2011-03-10 13:42 ` Johan Hedberg
@ 2011-03-10 14:16 ` Szymon Janc
2011-03-10 15:10 ` [PATCH v2] " Szymon Janc
0 siblings, 1 reply; 5+ messages in thread
From: Szymon Janc @ 2011-03-10 14:16 UTC (permalink / raw)
To: Johan Hedberg
Cc: linux-bluetooth@vger.kernel.org,
par-gunnar.p.hjalmdahl@stericsson.com,
henrik.possung@stericsson.com
> Hi Szymon,
>
> On Thu, Mar 10, 2011, Szymon Janc wrote:
> > Call driver remove callback only if corresponding probe succeed.
> > ---
> > src/adapter.c | 41 +++++++++++++++++++++++++----------------
> > 1 files changed, 25 insertions(+), 16 deletions(-)
>
> The patch looks ok'ish, but don't you have to update the
> btd_unregister_adapter_driver function too? (so it also removes
> potential entries in the loaded_drivers list)
Hmm all drivers unregisters them self only when plugin is unloaded, but it might
be good to be prepare for more 'dynamic' drivers in future..
Will prepare v2 shortly.
--
BR
Szymon Janc
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2] Fix unloading of adapter drivers
2011-03-10 14:16 ` Szymon Janc
@ 2011-03-10 15:10 ` Szymon Janc
2011-03-10 20:06 ` Johan Hedberg
0 siblings, 1 reply; 5+ messages in thread
From: Szymon Janc @ 2011-03-10 15:10 UTC (permalink / raw)
To: linux-bluetooth; +Cc: par-gunnar.p.hjalmdahl, henrik.possung, Szymon Janc
Call driver remove callback only if corresponding probe succeed.
---
src/adapter.c | 47 +++++++++++++++++++++++++++++++----------------
1 files changed, 31 insertions(+), 16 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index b119fd1..e8abf42 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -144,6 +144,8 @@ struct btd_adapter {
GSList *powered_callbacks;
gboolean name_stored;
+
+ GSList *loaded_drivers;
};
static void adapter_set_pairable_timeout(struct btd_adapter *adapter,
@@ -2246,23 +2248,25 @@ static void probe_driver(struct btd_adapter *adapter, gpointer user_data)
if (!adapter->up)
return;
+ if (driver->probe == NULL)
+ return;
+
err = driver->probe(adapter);
- if (err < 0)
+ if (err < 0) {
error("%s: %s (%d)", driver->name, strerror(-err), -err);
+ return;
+ }
+
+ adapter->loaded_drivers = g_slist_prepend(adapter->loaded_drivers,
+ driver);
}
static void load_drivers(struct btd_adapter *adapter)
{
GSList *l;
- for (l = adapter_drivers; l; l = l->next) {
- struct btd_adapter_driver *driver = l->data;
-
- if (driver->probe == NULL)
- continue;
-
- probe_driver(adapter, driver);
- }
+ for (l = adapter_drivers; l; l = l->next)
+ probe_driver(adapter, l->data);
}
static void load_connections(struct btd_adapter *adapter)
@@ -2477,16 +2481,20 @@ static void reply_pending_requests(struct btd_adapter *adapter)
}
}
-static void unload_drivers(struct btd_adapter *adapter)
+static void remove_driver(gpointer data, gpointer user_data)
{
- GSList *l;
+ struct btd_adapter_driver *driver = data;
+ struct btd_adapter *adapter = user_data;
- for (l = adapter_drivers; l; l = l->next) {
- struct btd_adapter_driver *driver = l->data;
+ if (driver->remove)
+ driver->remove(adapter);
+}
- if (driver->remove)
- driver->remove(adapter);
- }
+static void unload_drivers(struct btd_adapter *adapter)
+{
+ g_slist_foreach(adapter->loaded_drivers, remove_driver, adapter);
+ g_slist_free(adapter->loaded_drivers);
+ adapter->loaded_drivers = NULL;
}
static void set_mode_complete(struct btd_adapter *adapter)
@@ -3326,9 +3334,16 @@ int btd_register_adapter_driver(struct btd_adapter_driver *driver)
return 0;
}
+static void unload_driver(struct btd_adapter *adapter, gpointer data)
+{
+ adapter->loaded_drivers = g_slist_remove(adapter->loaded_drivers, data);
+}
+
void btd_unregister_adapter_driver(struct btd_adapter_driver *driver)
{
adapter_drivers = g_slist_remove(adapter_drivers, driver);
+
+ manager_foreach_adapter(unload_driver, driver);
}
static void agent_auth_cb(struct agent *agent, DBusError *derr,
--
1.7.0.4
on behalf of ST-Ericsson
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2] Fix unloading of adapter drivers
2011-03-10 15:10 ` [PATCH v2] " Szymon Janc
@ 2011-03-10 20:06 ` Johan Hedberg
0 siblings, 0 replies; 5+ messages in thread
From: Johan Hedberg @ 2011-03-10 20:06 UTC (permalink / raw)
To: Szymon Janc; +Cc: linux-bluetooth, par-gunnar.p.hjalmdahl, henrik.possung
Hi Szymon,
On Thu, Mar 10, 2011, Szymon Janc wrote:
> Call driver remove callback only if corresponding probe succeed.
> ---
> src/adapter.c | 47 +++++++++++++++++++++++++++++++----------------
> 1 files changed, 31 insertions(+), 16 deletions(-)
Pushed upstream. Thanks.
Johan
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-03-10 20:06 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-10 12:10 [PATCH] Fix unloading of adapter drivers Szymon Janc
2011-03-10 13:42 ` Johan Hedberg
2011-03-10 14:16 ` Szymon Janc
2011-03-10 15:10 ` [PATCH v2] " Szymon Janc
2011-03-10 20:06 ` Johan Hedberg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).