+ now = cfs_time_current_sec();
+ to = obd->obd_recovery_timeout;
+ end = obd->obd_recovery_start + to;
+ left = cfs_time_sub(end, now);
+
+ if (extend && (drt > left)) {
+ to += drt - left;
+ } else if (!extend && (drt > to)) {
+ to = drt;
+ /* reduce drt by already passed time */
+ drt -= obd->obd_recovery_timeout - left;
+ }
+
+ if (to > obd->obd_recovery_time_hard)
+ to = obd->obd_recovery_time_hard;
+ if (obd->obd_recovery_timeout < to) {
+ obd->obd_recovery_timeout = to;
+ cfs_timer_arm(&obd->obd_recovery_timer,
+ cfs_time_shift(drt));
+ }
+ cfs_spin_unlock(&obd->obd_dev_lock);
+
+ CDEBUG(D_HA, "%s: recovery timer will expire in %u seconds\n",
+ obd->obd_name, (unsigned)drt);