#define LPROC_SEQ_FOPS_RO(name) __LPROC_SEQ_FOPS(name, NULL)
#define LPROC_SEQ_FOPS(name) __LPROC_SEQ_FOPS(name, name##_seq_write)
+/* lprocfs_status.c: read recovery max time bz13079 */
+int lprocfs_obd_rd_recovery_maxtime(char *page, char **start, off_t off,
+ int count, int *eof, void *data);
+
+/* lprocfs_status.c: write recovery max time bz13079 */
+int lprocfs_obd_wr_recovery_maxtime(struct file *file, const char *buffer,
+ unsigned long count, void *data);
#else
/* LPROCFS is not defined */
static inline void lprocfs_counter_add(struct lprocfs_stats *stats,
void target_cancel_recovery_timer(struct obd_device *obd);
#define OBD_RECOVERY_TIMEOUT (obd_timeout * 5 / 2) /* *waves hands* */
+#define OBD_RECOVERY_MAX_TIME (obd_timeout * 18) /* b13079 */
void target_start_recovery_timer(struct obd_device *obd);
int target_start_recovery_thread(struct obd_device *obd,
svc_handler_t handler);
struct list_head obd_uncommitted_replies;
spinlock_t obd_uncommitted_replies_lock;
cfs_timer_t obd_recovery_timer;
- time_t obd_recovery_start;
- time_t obd_recovery_end;
+ time_t obd_recovery_start; /* seconds */
+ time_t obd_recovery_end; /* seconds */
+ time_t obd_recovery_max_time; /* seconds, bz13079 */
/* new recovery stuff from CMD2 */
struct target_recovery_data obd_recovery_data;
static void reset_recovery_timer(struct obd_device *obd)
{
+ time_t timeout_shift = OBD_RECOVERY_TIMEOUT;
spin_lock_bh(&obd->obd_processing_task_lock);
if (!obd->obd_recovering) {
spin_unlock_bh(&obd->obd_processing_task_lock);
return;
}
- cfs_timer_arm(&obd->obd_recovery_timer,
- cfs_time_shift(OBD_RECOVERY_TIMEOUT));
+ if (cfs_time_current_sec() + OBD_RECOVERY_TIMEOUT >
+ obd->obd_recovery_start + obd->obd_recovery_max_time)
+ timeout_shift = obd->obd_recovery_start +
+ obd->obd_recovery_max_time - cfs_time_current_sec();
+ cfs_timer_arm(&obd->obd_recovery_timer, cfs_time_shift(timeout_shift));
spin_unlock_bh(&obd->obd_processing_task_lock);
CDEBUG(D_HA, "%s: timer will expire in %u seconds\n", obd->obd_name,
- OBD_RECOVERY_TIMEOUT);
+ (unsigned int)timeout_shift);
/* Only used for lprocfs_status */
- obd->obd_recovery_end = CURRENT_SECONDS + OBD_RECOVERY_TIMEOUT;
+ obd->obd_recovery_end = CURRENT_SECONDS + timeout_shift;
}
obd->obd_recovery_start = CURRENT_SECONDS;
/* Only used for lprocfs_status */
obd->obd_recovery_end = obd->obd_recovery_start + OBD_RECOVERY_TIMEOUT;
+ /* bz13079: this should be set to desired value for ost but not for mds */
+ obd->obd_recovery_max_time = OBD_RECOVERY_MAX_TIME;
}
EXPORT_SYMBOL(target_recovery_init);
}
EXPORT_SYMBOL(lprocfs_obd_rd_recovery_status);
+int lprocfs_obd_rd_recovery_maxtime(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ struct obd_device *obd = (struct obd_device *)data;
+ LASSERT(obd != NULL);
+
+ return snprintf(page, count, "%lu\n",
+ obd->obd_recovery_max_time);
+}
+EXPORT_SYMBOL(lprocfs_obd_rd_recovery_maxtime);
+
+int lprocfs_obd_wr_recovery_maxtime(struct file *file, const char *buffer,
+ unsigned long count, void *data)
+{
+ struct obd_device *obd = (struct obd_device *)data;
+ int val, rc;
+ LASSERT(obd != NULL);
+
+ rc = lprocfs_write_helper(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ obd->obd_recovery_max_time = val;
+ return count;
+}
+EXPORT_SYMBOL(lprocfs_obd_wr_recovery_maxtime);
+
EXPORT_SYMBOL(lprocfs_register);
EXPORT_SYMBOL(lprocfs_srch);
EXPORT_SYMBOL(lprocfs_remove);
{ "tot_pending", lprocfs_filter_rd_tot_pending, 0, 0 },
{ "tot_granted", lprocfs_filter_rd_tot_granted, 0, 0 },
{ "recovery_status", lprocfs_obd_rd_recovery_status, 0, 0 },
+ { "recovery_maxtime", lprocfs_obd_rd_recovery_maxtime,
+ lprocfs_obd_wr_recovery_maxtime, 0},
{ "evict_client", 0, lprocfs_wr_evict_client, 0,
&lprocfs_evict_client_fops},
{ "num_exports", lprocfs_rd_num_exports, 0, 0 },