diff options
author | David Teigland <teigland@redhat.com> | 2012-06-05 12:23:21 -0400 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2012-07-16 15:18:12 -0400 |
commit | 6d768177c282637a7943e72b4b2b148e7553ecf1 (patch) | |
tree | ba850e74687aa03dce4f20cc9649c1d34ea9d959 /fs | |
parent | 05c32f47bfae74dabff05208957768078b53cc49 (diff) |
dlm: use wait_event_timeout
Use wait_event_timeout to avoid using a timer
directly.
Signed-off-by: David Teigland <teigland@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/dlm/recover.c | 29 |
1 files changed, 11 insertions, 18 deletions
diff --git a/fs/dlm/recover.c b/fs/dlm/recover.c index ff6f27629a0c..12702cc533b3 100644 --- a/fs/dlm/recover.c +++ b/fs/dlm/recover.c | |||
@@ -36,30 +36,23 @@ | |||
36 | * (LS_RECOVERY_STOP set due to failure of a node in ls_nodes). When another | 36 | * (LS_RECOVERY_STOP set due to failure of a node in ls_nodes). When another |
37 | * function thinks it could have completed the waited-on task, they should wake | 37 | * function thinks it could have completed the waited-on task, they should wake |
38 | * up ls_wait_general to get an immediate response rather than waiting for the | 38 | * up ls_wait_general to get an immediate response rather than waiting for the |
39 | * timer to detect the result. A timer wakes us up periodically while waiting | 39 | * timeout. This uses a timeout so it can check periodically if the wait |
40 | * to see if we should abort due to a node failure. This should only be called | 40 | * should abort due to node failure (which doesn't cause a wake_up). |
41 | * by the dlm_recoverd thread. | 41 | * This should only be called by the dlm_recoverd thread. |
42 | */ | 42 | */ |
43 | 43 | ||
44 | static void dlm_wait_timer_fn(unsigned long data) | ||
45 | { | ||
46 | struct dlm_ls *ls = (struct dlm_ls *) data; | ||
47 | mod_timer(&ls->ls_timer, jiffies + (dlm_config.ci_recover_timer * HZ)); | ||
48 | wake_up(&ls->ls_wait_general); | ||
49 | } | ||
50 | |||
51 | int dlm_wait_function(struct dlm_ls *ls, int (*testfn) (struct dlm_ls *ls)) | 44 | int dlm_wait_function(struct dlm_ls *ls, int (*testfn) (struct dlm_ls *ls)) |
52 | { | 45 | { |
53 | int error = 0; | 46 | int error = 0; |
47 | int rv; | ||
54 | 48 | ||
55 | init_timer(&ls->ls_timer); | 49 | while (1) { |
56 | ls->ls_timer.function = dlm_wait_timer_fn; | 50 | rv = wait_event_timeout(ls->ls_wait_general, |
57 | ls->ls_timer.data = (long) ls; | 51 | testfn(ls) || dlm_recovery_stopped(ls), |
58 | ls->ls_timer.expires = jiffies + (dlm_config.ci_recover_timer * HZ); | 52 | dlm_config.ci_recover_timer * HZ); |
59 | add_timer(&ls->ls_timer); | 53 | if (rv) |
60 | 54 | break; | |
61 | wait_event(ls->ls_wait_general, testfn(ls) || dlm_recovery_stopped(ls)); | 55 | } |
62 | del_timer_sync(&ls->ls_timer); | ||
63 | 56 | ||
64 | if (dlm_recovery_stopped(ls)) { | 57 | if (dlm_recovery_stopped(ls)) { |
65 | log_debug(ls, "dlm_wait_function aborted"); | 58 | log_debug(ls, "dlm_wait_function aborted"); |