[lvm-devel] [PATCHv2 2/4] dmeventd: Fix registration of existing thread
Marian Csontos
mcsontos at redhat.com
Tue Sep 22 11:16:08 UTC 2015
The existing code is handling only new registrations correctly. Extending
an existing registration does not register for timeout.
---
If the condition should "never occur" we should either handle it or at least
raise an internal error here as it is likely to occur one day without traces
what happened.
*TODO* Any ideas how to test this? Is explicitly messaging dmeventd required?
daemons/dmeventd/dmeventd.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/daemons/dmeventd/dmeventd.c b/daemons/dmeventd/dmeventd.c
index 0f67206..ff11625 100644
--- a/daemons/dmeventd/dmeventd.c
+++ b/daemons/dmeventd/dmeventd.c
@@ -1031,6 +1031,7 @@ static int _register_for_event(struct message_data *message_data)
int ret = 0;
struct thread_status *thread, *thread_new = NULL;
struct dso_data *dso_data;
+ enum dm_event_mask orig_events
if (!(dso_data = _lookup_dso(message_data)) &&
!(dso_data = _load_dso(message_data))) {
@@ -1087,10 +1088,23 @@ static int _register_for_event(struct message_data *message_data)
}
LINK_THREAD(thread);
+ } else {
+ /* Or event # into events bitfield. */
+ orig_events = thread->events;
+ thread->events |= message_data->events_field;
+ if ((~orig_events & thread->events & DM_EVENT_TIMEOUT)) {
+ _unlock_mutex();
+ if (!(ret = -_register_for_timeout(thread))) {
+ /* In case previous calls failed we do not
+ * force unregister event. Reset events for
+ * consistency. */
+ _lock_mutex();
+ thread->events &= ~DM_EVENT_TIMEOUT;
+ } else
+ _lock_mutex();
+ }
}
- /* Or event # into events bitfield. */
- thread->events |= message_data->events_field;
_unlock_mutex();
out:
--
1.8.3.1
More information about the lvm-devel
mailing list