Port the remaining time code from 32 bits to 64 bits.
Replace cfs_time_current_sec() to avoid the overflow
issues in 2038 with ktime_get_real_seconds(). Moved
lprocfs_ir_timeout_seq_show from printing 32 times
to 64 bit times. Do a direction compare instead of
using the cfs_time_before() wrapper. Change the
following to time64_t:
fsdb_barrier_expected
fsdb_barrier_latest_create_time
mgs_start_time
ir_timeout
Change-Id: I10bfd3f1479ad2823e325bfc464b802b210c238f
Signed-off-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-on: https://review.whamcloud.com/27910
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
return true;
}
+bool mgs_barrier_expired(struct fs_db *fsdb, time64_t timeout)
+{
+ time64_t expired = fsdb->fsdb_barrier_latest_create_time + timeout;
+
+ return expired > ktime_get_real_seconds();
+}
+
/**
* Create the barrier for the given instance.
*
char *name = mgs_env_info(env)->mgi_fsname;
struct fs_db *fsdb;
int rc = 0;
- int left;
+ time64_t left;
bool phase1 = true;
bool dirty = false;
ENTRY;
rc = -EINPROGRESS;
break;
case BS_FROZEN:
- if (cfs_time_before(cfs_time_current_sec(),
- fsdb->fsdb_barrier_latest_create_time +
- fsdb->fsdb_barrier_timeout)) {
+ if (mgs_barrier_expired(fsdb, fsdb->fsdb_barrier_timeout)) {
rc = -EALREADY;
break;
}
rc = -ENODEV;
} else {
fsdb->fsdb_barrier_latest_create_time =
- cfs_time_current_sec();
+ ktime_get_real_seconds();
fsdb->fsdb_barrier_status = BS_FREEZING_P1;
if (bc->bc_timeout != 0)
fsdb->fsdb_barrier_timeout = bc->bc_timeout;
dirty = true;
left = fsdb->fsdb_barrier_latest_create_time +
- fsdb->fsdb_barrier_timeout - cfs_time_current_sec();
+ fsdb->fsdb_barrier_timeout - ktime_get_real_seconds();
if (left <= 0) {
fsdb->fsdb_barrier_status = BS_EXPIRED;
if (bc->bc_status == BS_FREEZING_P1 ||
bc->bc_status == BS_FREEZING_P2 ||
bc->bc_status == BS_FROZEN) {
- if (cfs_time_before(cfs_time_current_sec(),
- fsdb->fsdb_barrier_latest_create_time +
- fsdb->fsdb_barrier_timeout))
+ if (mgs_barrier_expired(fsdb, fsdb->fsdb_barrier_timeout))
bc->bc_timeout =
fsdb->fsdb_barrier_latest_create_time +
fsdb->fsdb_barrier_timeout -
- cfs_time_current_sec();
+ ktime_get_real_seconds();
else
bc->bc_status = fsdb->fsdb_barrier_status =
BS_EXPIRED;
rc = -EBUSY;
break;
case BS_FROZEN:
- if (cfs_time_before(cfs_time_current_sec(),
- b_fsdb->fsdb_barrier_latest_create_time +
- b_fsdb->fsdb_barrier_timeout)) {
+ if (mgs_barrier_expired(b_fsdb, b_fsdb->fsdb_barrier_timeout)) {
rc = -EBUSY;
break;
}
case BS_THAWED:
case BS_EXPIRED:
case BS_FAILED:
- b_fsdb->fsdb_barrier_latest_create_time =
- cfs_time_current_sec();
+ b_fsdb->fsdb_barrier_latest_create_time = ktime_get_real_seconds();
b_fsdb->fsdb_barrier_status = BS_RESCAN;
memcpy(b_fsdb->fsdb_mdt_index_map, c_fsdb->fsdb_mdt_index_map,
INDEX_MAP_SIZE);
b_fsdb->fsdb_barrier_status = rc;
rc = -EREMOTE;
} else if (rc == -ETIMEDOUT &&
- cfs_time_before(cfs_time_current_sec(),
- b_fsdb->fsdb_barrier_latest_create_time +
- bc->bc_timeout)) {
+ mgs_barrier_expired(b_fsdb, bc->bc_timeout)) {
memset(b_fsdb->fsdb_barrier_map, 0, INDEX_MAP_SIZE);
goto again;
/* Internal mgs setup */
mgs_init_fsdb_list(mgs);
mutex_init(&mgs->mgs_mutex);
- mgs->mgs_start_time = cfs_time_current_sec();
+ mgs->mgs_start_time = ktime_get_real_seconds();
spin_lock_init(&mgs->mgs_lock);
mutex_init(&mgs->mgs_health_mutex);
init_rwsem(&mgs->mgs_barrier_rwsem);
};
void *fsdb_mdt_index_map; /* bitmap of used indicies */
atomic_t fsdb_ref;
- int fsdb_mdt_count;
char *fsdb_clilov; /* COMPAT_146 client lov name */
char *fsdb_clilmv;
unsigned long fsdb_flags;
__u32 fsdb_barrier_status;
- __u32 fsdb_barrier_timeout;
+ int fsdb_mdt_count;
+ time64_t fsdb_barrier_timeout;
__u32 fsdb_barrier_expected;
int fsdb_barrier_result;
- time_t fsdb_barrier_latest_create_time;
+ time64_t fsdb_barrier_latest_create_time;
/* in-memory copy of the srpc rules, guarded by fsdb_lock */
struct sptlrpc_rule_set fsdb_srpc_gen;
struct proc_dir_entry *mgs_proc_osd;
struct proc_dir_entry *mgs_proc_fstype;
struct proc_dir_entry *mgs_proc_mntdev;
- cfs_time_t mgs_start_time;
+ time64_t mgs_start_time;
struct obd_device *mgs_obd;
struct kset *mgs_kset;
struct local_oid_storage *mgs_los;
GOTO(out_free, rc = -E2BIG);
/* Modify mostly means cancel */
mml->mml_marker.cm_flags = flags;
- mml->mml_marker.cm_canceltime = flags ? cfs_time_current_sec() : 0;
+ mml->mml_marker.cm_canceltime = flags ? ktime_get_real_seconds() : 0;
mml->mml_modified = 0;
rc = llog_process(env, loghandle, mgs_modify_handler, (void *)mml,
NULL);
sizeof(mgi->mgi_marker.cm_comment));
if (cplen >= sizeof(mgi->mgi_marker.cm_comment))
return -E2BIG;
- mgi->mgi_marker.cm_createtime = cfs_time_current_sec();
+ mgi->mgi_marker.cm_createtime = ktime_get_real_seconds();
mgi->mgi_marker.cm_canceltime = 0;
lustre_cfg_bufs_reset(&mgi->mgi_bufs, NULL);
lustre_cfg_bufs_set(&mgi->mgi_bufs, 1, &mgi->mgi_marker,
#include "mgs_internal.h"
-static unsigned int ir_timeout;
+static time64_t ir_timeout;
static int nidtbl_is_sane(struct mgs_nidtbl *tbl)
{
struct task_struct *task;
if (!ir_timeout)
- ir_timeout = OBD_IR_MGS_TIMEOUT;
+ ir_timeout = (time64_t)OBD_IR_MGS_TIMEOUT;
fsdb->fsdb_ir_state = IR_FULL;
- if (cfs_time_before(cfs_time_current_sec(),
- mgs->mgs_start_time + ir_timeout))
+ if (mgs->mgs_start_time + ir_timeout > ktime_get_real_seconds())
fsdb->fsdb_ir_state = IR_STARTUP;
fsdb->fsdb_nonir_clients = 0;
/* start notify thread */
static inline void ir_state_graduate(struct fs_db *fsdb)
{
if (fsdb->fsdb_ir_state == IR_STARTUP) {
- if (cfs_time_before(fsdb->fsdb_mgs->mgs_start_time + ir_timeout,
- cfs_time_current_sec())) {
+ if (ktime_get_real_seconds() >
+ fsdb->fsdb_mgs->mgs_start_time + ir_timeout) {
fsdb->fsdb_ir_state = IR_FULL;
if (fsdb->fsdb_nonir_clients)
fsdb->fsdb_ir_state = IR_PARTIAL;
int lprocfs_ir_timeout_seq_show(struct seq_file *m, void *data)
{
- return lprocfs_uint_seq_show(m, &ir_timeout);
+ return lprocfs_u64_seq_show(m, &ir_timeout);
}
ssize_t lprocfs_ir_timeout_seq_write(struct file *file,