aboutsummaryrefslogtreecommitdiffstats
path: root/fs/dlm
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2012-06-05 12:23:21 -0400
committerDavid Teigland <teigland@redhat.com>2012-07-16 15:18:12 -0400
commit6d768177c282637a7943e72b4b2b148e7553ecf1 (patch)
treeba850e74687aa03dce4f20cc9649c1d34ea9d959 /fs/dlm
parent05c32f47bfae74dabff05208957768078b53cc49 (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/dlm')
-rw-r--r--fs/dlm/recover.c29
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
44static 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
51int dlm_wait_function(struct dlm_ls *ls, int (*testfn) (struct dlm_ls *ls)) 44int 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");