|
@@ -742,6 +742,8 @@ static void add_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int status)
|
|
|
|
|
|
DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb););
|
|
DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb););
|
|
|
|
|
|
|
|
+ lkb->lkb_timestamp = ktime_get();
|
|
|
|
+
|
|
lkb->lkb_status = status;
|
|
lkb->lkb_status = status;
|
|
|
|
|
|
switch (status) {
|
|
switch (status) {
|
|
@@ -1011,10 +1013,8 @@ static void add_timeout(struct dlm_lkb *lkb)
|
|
{
|
|
{
|
|
struct dlm_ls *ls = lkb->lkb_resource->res_ls;
|
|
struct dlm_ls *ls = lkb->lkb_resource->res_ls;
|
|
|
|
|
|
- if (is_master_copy(lkb)) {
|
|
|
|
- lkb->lkb_timestamp = jiffies;
|
|
|
|
|
|
+ if (is_master_copy(lkb))
|
|
return;
|
|
return;
|
|
- }
|
|
|
|
|
|
|
|
if (test_bit(LSFL_TIMEWARN, &ls->ls_flags) &&
|
|
if (test_bit(LSFL_TIMEWARN, &ls->ls_flags) &&
|
|
!(lkb->lkb_exflags & DLM_LKF_NODLCKWT)) {
|
|
!(lkb->lkb_exflags & DLM_LKF_NODLCKWT)) {
|
|
@@ -1029,7 +1029,6 @@ static void add_timeout(struct dlm_lkb *lkb)
|
|
DLM_ASSERT(list_empty(&lkb->lkb_time_list), dlm_print_lkb(lkb););
|
|
DLM_ASSERT(list_empty(&lkb->lkb_time_list), dlm_print_lkb(lkb););
|
|
mutex_lock(&ls->ls_timeout_mutex);
|
|
mutex_lock(&ls->ls_timeout_mutex);
|
|
hold_lkb(lkb);
|
|
hold_lkb(lkb);
|
|
- lkb->lkb_timestamp = jiffies;
|
|
|
|
list_add_tail(&lkb->lkb_time_list, &ls->ls_timeout);
|
|
list_add_tail(&lkb->lkb_time_list, &ls->ls_timeout);
|
|
mutex_unlock(&ls->ls_timeout_mutex);
|
|
mutex_unlock(&ls->ls_timeout_mutex);
|
|
}
|
|
}
|
|
@@ -1057,6 +1056,7 @@ void dlm_scan_timeout(struct dlm_ls *ls)
|
|
struct dlm_rsb *r;
|
|
struct dlm_rsb *r;
|
|
struct dlm_lkb *lkb;
|
|
struct dlm_lkb *lkb;
|
|
int do_cancel, do_warn;
|
|
int do_cancel, do_warn;
|
|
|
|
+ s64 wait_us;
|
|
|
|
|
|
for (;;) {
|
|
for (;;) {
|
|
if (dlm_locking_stopped(ls))
|
|
if (dlm_locking_stopped(ls))
|
|
@@ -1067,14 +1067,15 @@ void dlm_scan_timeout(struct dlm_ls *ls)
|
|
mutex_lock(&ls->ls_timeout_mutex);
|
|
mutex_lock(&ls->ls_timeout_mutex);
|
|
list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) {
|
|
list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) {
|
|
|
|
|
|
|
|
+ wait_us = ktime_to_us(ktime_sub(ktime_get(),
|
|
|
|
+ lkb->lkb_timestamp));
|
|
|
|
+
|
|
if ((lkb->lkb_exflags & DLM_LKF_TIMEOUT) &&
|
|
if ((lkb->lkb_exflags & DLM_LKF_TIMEOUT) &&
|
|
- time_after_eq(jiffies, lkb->lkb_timestamp +
|
|
|
|
- lkb->lkb_timeout_cs * HZ/100))
|
|
|
|
|
|
+ wait_us >= (lkb->lkb_timeout_cs * 10000))
|
|
do_cancel = 1;
|
|
do_cancel = 1;
|
|
|
|
|
|
if ((lkb->lkb_flags & DLM_IFL_WATCH_TIMEWARN) &&
|
|
if ((lkb->lkb_flags & DLM_IFL_WATCH_TIMEWARN) &&
|
|
- time_after_eq(jiffies, lkb->lkb_timestamp +
|
|
|
|
- dlm_config.ci_timewarn_cs * HZ/100))
|
|
|
|
|
|
+ wait_us >= dlm_config.ci_timewarn_cs * 10000)
|
|
do_warn = 1;
|
|
do_warn = 1;
|
|
|
|
|
|
if (!do_cancel && !do_warn)
|
|
if (!do_cancel && !do_warn)
|
|
@@ -1120,12 +1121,12 @@ void dlm_scan_timeout(struct dlm_ls *ls)
|
|
void dlm_adjust_timeouts(struct dlm_ls *ls)
|
|
void dlm_adjust_timeouts(struct dlm_ls *ls)
|
|
{
|
|
{
|
|
struct dlm_lkb *lkb;
|
|
struct dlm_lkb *lkb;
|
|
- long adj = jiffies - ls->ls_recover_begin;
|
|
|
|
|
|
+ u64 adj_us = jiffies_to_usecs(jiffies - ls->ls_recover_begin);
|
|
|
|
|
|
ls->ls_recover_begin = 0;
|
|
ls->ls_recover_begin = 0;
|
|
mutex_lock(&ls->ls_timeout_mutex);
|
|
mutex_lock(&ls->ls_timeout_mutex);
|
|
list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list)
|
|
list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list)
|
|
- lkb->lkb_timestamp += adj;
|
|
|
|
|
|
+ lkb->lkb_timestamp = ktime_add_us(lkb->lkb_timestamp, adj_us);
|
|
mutex_unlock(&ls->ls_timeout_mutex);
|
|
mutex_unlock(&ls->ls_timeout_mutex);
|
|
}
|
|
}
|
|
|
|
|