- spin_lock_bh(&export->exp_bl_list_lock);
- list_del_init(&lock->l_exp_list);
- spin_unlock_bh(&export->exp_bl_list_lock);
-
- do_dump++;
- class_fail_export(export);
+ /* Check if we need to prolong timeout */
+ if (!OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_HPREQ_TIMEOUT) &&
+ lock->l_callback_timeout != 0 && /* not AST error */
+ ldlm_lock_busy(lock)) {
+ LDLM_DEBUG(lock, "prolong the busy lock");
+ lock_res_and_lock(lock);
+ ldlm_add_waiting_lock(lock,
+ ldlm_bl_timeout(lock) >> 1);
+ unlock_res_and_lock(lock);
+ } else {
+ spin_lock_bh(&export->exp_bl_list_lock);
+ list_del_init(&lock->l_exp_list);
+ spin_unlock_bh(&export->exp_bl_list_lock);
+
+ LDLM_ERROR(lock,
+ "lock callback timer expired after "
+ "%llds: evicting client at %s ",
+ cfs_time_current_sec() -
+ lock->l_last_activity,
+ obd_export_nid2str(export));
+ ldlm_lock_to_ns(lock)->ns_timeouts++;
+ do_dump++;
+ class_fail_export(export);
+ }