From: James Simmons Date: Tue, 1 Aug 2017 06:25:58 +0000 (-0400) Subject: LU-9019 mgs: migrate to 64 bit time X-Git-Tag: 2.10.52~44 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=refs%2Fchanges%2F10%2F27910%2F11;p=fs%2Flustre-release.git LU-9019 mgs: migrate to 64 bit time 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 Reviewed-on: https://review.whamcloud.com/27910 Reviewed-by: Fan Yong Reviewed-by: Andreas Dilger Tested-by: Jenkins Tested-by: Maloo --- diff --git a/lustre/mgs/mgs_barrier.c b/lustre/mgs/mgs_barrier.c index e661063..7d98937 100644 --- a/lustre/mgs/mgs_barrier.c +++ b/lustre/mgs/mgs_barrier.c @@ -247,6 +247,13 @@ static bool mgs_barrier_done(struct fs_db *fsdb) 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. * @@ -293,7 +300,7 @@ static int mgs_barrier_freeze(const struct lu_env *env, 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; @@ -328,9 +335,7 @@ static int mgs_barrier_freeze(const struct lu_env *env, 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; } @@ -344,7 +349,7 @@ static int mgs_barrier_freeze(const struct lu_env *env, 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; @@ -379,7 +384,7 @@ again: 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; @@ -550,13 +555,11 @@ static int mgs_barrier_stat(const struct lu_env *env, 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; @@ -619,9 +622,7 @@ static int mgs_barrier_rescan(const struct lu_env *env, 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; } @@ -629,8 +630,7 @@ static int mgs_barrier_rescan(const struct lu_env *env, 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); @@ -665,9 +665,7 @@ again: 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; diff --git a/lustre/mgs/mgs_handler.c b/lustre/mgs/mgs_handler.c index 8c92803..35efe5b 100644 --- a/lustre/mgs/mgs_handler.c +++ b/lustre/mgs/mgs_handler.c @@ -1313,7 +1313,7 @@ static int mgs_init0(const struct lu_env *env, struct mgs_device *mgs, /* 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); diff --git a/lustre/mgs/mgs_internal.h b/lustre/mgs/mgs_internal.h index 70d75ad..d9e95d6 100644 --- a/lustre/mgs/mgs_internal.h +++ b/lustre/mgs/mgs_internal.h @@ -125,15 +125,15 @@ struct fs_db { }; 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; @@ -177,7 +177,7 @@ struct mgs_device { 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; diff --git a/lustre/mgs/mgs_llog.c b/lustre/mgs/mgs_llog.c index 68c8681..58adec2 100644 --- a/lustre/mgs/mgs_llog.c +++ b/lustre/mgs/mgs_llog.c @@ -935,7 +935,7 @@ static int mgs_modify(const struct lu_env *env, struct mgs_device *mgs, 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); @@ -1591,7 +1591,7 @@ static int record_marker(const struct lu_env *env, 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, diff --git a/lustre/mgs/mgs_nids.c b/lustre/mgs/mgs_nids.c index 1e24fe8..15fc655 100644 --- a/lustre/mgs/mgs_nids.c +++ b/lustre/mgs/mgs_nids.c @@ -48,7 +48,7 @@ #include "mgs_internal.h" -static unsigned int ir_timeout; +static time64_t ir_timeout; static int nidtbl_is_sane(struct mgs_nidtbl *tbl) { @@ -454,11 +454,10 @@ int mgs_ir_init_fs(const struct lu_env *env, struct mgs_device *mgs, 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 */ @@ -494,8 +493,8 @@ void mgs_ir_fini_fs(struct mgs_device *mgs, struct fs_db *fsdb) 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; @@ -832,7 +831,7 @@ int lprocfs_rd_ir_state(struct seq_file *seq, void *data) 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,