Whamcloud - gitweb
LU-9019 mgs: migrate to 64 bit time 10/27910/11
authorJames Simmons <uja.ornl@yahoo.com>
Tue, 1 Aug 2017 06:25:58 +0000 (02:25 -0400)
committerOleg Drokin <oleg.drokin@intel.com>
Sat, 5 Aug 2017 00:37:44 +0000 (00:37 +0000)
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>
lustre/mgs/mgs_barrier.c
lustre/mgs/mgs_handler.c
lustre/mgs/mgs_internal.h
lustre/mgs/mgs_llog.c
lustre/mgs/mgs_nids.c

index e661063..7d98937 100644 (file)
@@ -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;
index 8c92803..35efe5b 100644 (file)
@@ -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);
index 70d75ad..d9e95d6 100644 (file)
@@ -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;
index 68c8681..58adec2 100644 (file)
@@ -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,
index 1e24fe8..15fc655 100644 (file)
@@ -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,