lustre-devel-lustre.org archive mirror
 help / color / mirror / Atom feed
From: James Simmons <jsimmons@infradead.org>
To: lustre-devel@lists.lustre.org
Subject: [lustre-devel] [PATCH 102/151] lustre: libcfs: remove cfs_time_XXX_64 wrappers
Date: Mon, 30 Sep 2019 14:56:01 -0400	[thread overview]
Message-ID: <1569869810-23848-103-git-send-email-jsimmons@infradead.org> (raw)
In-Reply-To: <1569869810-23848-1-git-send-email-jsimmons@infradead.org>

In an attempt to support 64 bit time handling before the linux
kernel developed time64_t and ktime lustre attempted to use
64 bit jiffies with a libcfs abstraction. Lets remove these
wrappers and replace them with modern 64 bit time support. The
lustre code that used these wrappers needs time resolution at
the seconds level so replace the code with time64_t handling.

WC-bug-id: https://jira.whamcloud.com/browse/LU-9019
Lustre-commit: 2728de4db8c0 ("LU-9019 libcfs: remove cfs_time_XXX_64 wrappers")
Signed-off-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-on: https://review.whamcloud.com/30867
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Dmitry Eremin <dmitry.eremin@intel.com>
Signed-off-by: James Simmons <jsimmons@infradead.org>
---
 fs/lustre/include/lustre_import.h   | 10 ++++----
 fs/lustre/include/obd.h             |  6 ++---
 fs/lustre/include/obd_class.h       | 14 +++++------
 fs/lustre/llite/llite_internal.h    |  2 +-
 fs/lustre/llite/llite_lib.c         |  6 ++---
 fs/lustre/llite/lproc_llite.c       | 12 +++++-----
 fs/lustre/lmv/lmv_obd.c             |  4 ++--
 fs/lustre/lov/lov_obd.c             |  4 ++--
 fs/lustre/lov/lov_request.c         |  4 ++--
 fs/lustre/mdc/mdc_request.c         |  4 ++--
 fs/lustre/obdclass/genops.c         |  2 +-
 fs/lustre/obdclass/lprocfs_status.c | 48 +++++++++++++++++++++++--------------
 fs/lustre/osc/osc_request.c         |  4 ++--
 fs/lustre/ptlrpc/import.c           | 10 ++++----
 14 files changed, 70 insertions(+), 60 deletions(-)

diff --git a/fs/lustre/include/lustre_import.h b/fs/lustre/include/lustre_import.h
index 6a2d402..2d8f6be 100644
--- a/fs/lustre/include/lustre_import.h
+++ b/fs/lustre/include/lustre_import.h
@@ -134,10 +134,10 @@ struct obd_import_conn {
 	struct ptlrpc_connection	*oic_conn;
 	/** uuid of remote side */
 	struct obd_uuid			oic_uuid;
-	/**
-	 * Time (64 bit jiffies) of last connection attempt on this connection
+	/*
+	 * Time (64 bit seconds) of last connection attempt on this connection
 	 */
-	u64				oic_last_attempt;
+	time64_t			oic_last_attempt;
 };
 
 /* state history */
@@ -251,8 +251,8 @@ struct obd_import {
 	struct lustre_handle		imp_remote_handle;
 	/** When to perform next ping. time in jiffies. */
 	time64_t			imp_next_ping;
-	/** When we last successfully connected. time in 64bit jiffies */
-	u64				imp_last_success_conn;
+	/** When we last successfully connected. time in 64bit seconds */
+	time64_t			imp_last_success_conn;
 
 	/** List of all possible connection for import. */
 	struct list_head		imp_conn_list;
diff --git a/fs/lustre/include/obd.h b/fs/lustre/include/obd.h
index 309a168..1cb37a0 100644
--- a/fs/lustre/include/obd.h
+++ b/fs/lustre/include/obd.h
@@ -587,7 +587,7 @@ struct obd_device {
 	spinlock_t		 obd_dev_lock; /* protect OBD bitfield above */
 	spinlock_t		 obd_osfs_lock;
 	struct obd_statfs	 obd_osfs;       /* locked by obd_osfs_lock */
-	u64			 obd_osfs_age;
+	time64_t		 obd_osfs_age;
 	u64			 obd_last_committed;
 	struct mutex		 obd_dev_mutex;
 	struct lvfs_run_ctxt	 obd_lvfs_ctxt;
@@ -850,9 +850,9 @@ struct obd_ops {
 	 * about this.
 	 */
 	int (*statfs)(const struct lu_env *, struct obd_export *exp,
-		      struct obd_statfs *osfs, u64 max_age, u32 flags);
+		      struct obd_statfs *osfs, time64_t max_age, u32 flags);
 	int (*statfs_async)(struct obd_export *exp, struct obd_info *oinfo,
-			    u64 max_age, struct ptlrpc_request_set *set);
+			    time64_t max_age, struct ptlrpc_request_set *set);
 	int (*create)(const struct lu_env *env, struct obd_export *exp,
 		      struct obdo *oa);
 	int (*destroy)(const struct lu_env *env, struct obd_export *exp,
diff --git a/fs/lustre/include/obd_class.h b/fs/lustre/include/obd_class.h
index f977b2e..dd07ec5 100644
--- a/fs/lustre/include/obd_class.h
+++ b/fs/lustre/include/obd_class.h
@@ -874,7 +874,7 @@ static inline int obd_destroy_export(struct obd_export *exp)
  */
 static inline int obd_statfs_async(struct obd_export *exp,
 				   struct obd_info *oinfo,
-				   u64 max_age,
+				   time64_t max_age,
 				   struct ptlrpc_request_set *rqset)
 {
 	int rc = 0;
@@ -889,9 +889,9 @@ static inline int obd_statfs_async(struct obd_export *exp,
 		return -EOPNOTSUPP;
 	}
 
-	CDEBUG(D_SUPER, "%s: osfs %p age %llu, max_age %llu\n",
+	CDEBUG(D_SUPER, "%s: osfs %p age %lld, max_age %lld\n",
 	       obd->obd_name, &obd->obd_osfs, obd->obd_osfs_age, max_age);
-	if (time_before64(obd->obd_osfs_age, max_age)) {
+	if (obd->obd_osfs_age < max_age) {
 		rc = OBP(obd, statfs_async)(exp, oinfo, max_age, rqset);
 	} else {
 		CDEBUG(D_SUPER,
@@ -915,7 +915,7 @@ static inline int obd_statfs_async(struct obd_export *exp,
  * target.  Use a value of "jiffies + HZ" to guarantee freshness.
  */
 static inline int obd_statfs(const struct lu_env *env, struct obd_export *exp,
-			     struct obd_statfs *osfs, u64 max_age,
+			     struct obd_statfs *osfs, time64_t max_age,
 			     u32 flags)
 {
 	struct obd_device *obd = exp->exp_obd;
@@ -929,14 +929,14 @@ static inline int obd_statfs(const struct lu_env *env, struct obd_export *exp,
 		return -EOPNOTSUPP;
 	}
 
-	CDEBUG(D_SUPER, "osfs %llu, max_age %llu\n",
+	CDEBUG(D_SUPER, "osfs %lld, max_age %lld\n",
 	       obd->obd_osfs_age, max_age);
-	if (time_before64(obd->obd_osfs_age, max_age)) {
+	if (obd->obd_osfs_age < max_age) {
 		rc = OBP(obd, statfs)(env, exp, osfs, max_age, flags);
 		if (rc == 0) {
 			spin_lock(&obd->obd_osfs_lock);
 			memcpy(&obd->obd_osfs, osfs, sizeof(obd->obd_osfs));
-			obd->obd_osfs_age = get_jiffies_64();
+			obd->obd_osfs_age = ktime_get_seconds();
 			spin_unlock(&obd->obd_osfs_lock);
 		}
 	} else {
diff --git a/fs/lustre/llite/llite_internal.h b/fs/lustre/llite/llite_internal.h
index 229d417..fc4c4db 100644
--- a/fs/lustre/llite/llite_internal.h
+++ b/fs/lustre/llite/llite_internal.h
@@ -878,7 +878,7 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr,
 int ll_setattr(struct dentry *de, struct iattr *attr);
 int ll_statfs(struct dentry *de, struct kstatfs *sfs);
 int ll_statfs_internal(struct ll_sb_info *sbi, struct obd_statfs *osfs,
-		       u64 max_age, u32 flags);
+		       time64_t max_age, __u32 flags);
 int ll_update_inode(struct inode *inode, struct lustre_md *md);
 void ll_update_inode_flags(struct inode *inode, int ext_flags);
 int ll_read_inode2(struct inode *inode, void *opaque);
diff --git a/fs/lustre/llite/llite_lib.c b/fs/lustre/llite/llite_lib.c
index d4ff2bf..4f4234d 100644
--- a/fs/lustre/llite/llite_lib.c
+++ b/fs/lustre/llite/llite_lib.c
@@ -288,7 +288,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt)
 	 * available
 	 */
 	err = obd_statfs(NULL, sbi->ll_md_exp, osfs,
-			 get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
+			 ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
 			 OBD_STATFS_FOR_MDT0);
 	if (err)
 		goto out_md_fid;
@@ -1716,7 +1716,7 @@ int ll_setattr(struct dentry *de, struct iattr *attr)
 }
 
 int ll_statfs_internal(struct ll_sb_info *sbi, struct obd_statfs *osfs,
-		       u64 max_age, u32 flags)
+		       time64_t max_age, u32 flags)
 {
 	struct obd_statfs obd_osfs;
 	int rc;
@@ -1775,7 +1775,7 @@ int ll_statfs(struct dentry *de, struct kstatfs *sfs)
 
 	/* Some amount of caching on the client is allowed */
 	rc = ll_statfs_internal(ll_s2sbi(sb), &osfs,
-				get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
+				ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
 				0);
 	if (rc)
 		return rc;
diff --git a/fs/lustre/llite/lproc_llite.c b/fs/lustre/llite/lproc_llite.c
index 81c8fe6..9173d94 100644
--- a/fs/lustre/llite/lproc_llite.c
+++ b/fs/lustre/llite/lproc_llite.c
@@ -141,7 +141,7 @@ static ssize_t blocksize_show(struct kobject *kobj, struct attribute *attr,
 	int rc;
 
 	rc = ll_statfs_internal(sbi, &osfs,
-				get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
+				ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
 				OBD_STATFS_NODELAY);
 	if (rc)
 		return rc;
@@ -193,7 +193,7 @@ static ssize_t kbytestotal_show(struct kobject *kobj, struct attribute *attr,
 	int rc;
 
 	rc = ll_statfs_internal(sbi, &osfs,
-				get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
+				ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
 				OBD_STATFS_NODELAY);
 	if (rc)
 		return rc;
@@ -219,7 +219,7 @@ static ssize_t kbytesfree_show(struct kobject *kobj, struct attribute *attr,
 	int rc;
 
 	rc = ll_statfs_internal(sbi, &osfs,
-				get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
+				ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
 				OBD_STATFS_NODELAY);
 	if (rc)
 		return rc;
@@ -245,7 +245,7 @@ static ssize_t kbytesavail_show(struct kobject *kobj, struct attribute *attr,
 	int rc;
 
 	rc = ll_statfs_internal(sbi, &osfs,
-				get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
+				ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
 				OBD_STATFS_NODELAY);
 	if (rc)
 		return rc;
@@ -269,7 +269,7 @@ static ssize_t filestotal_show(struct kobject *kobj, struct attribute *attr,
 	int rc;
 
 	rc = ll_statfs_internal(sbi, &osfs,
-				get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
+				ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
 				OBD_STATFS_NODELAY);
 	if (rc)
 		return rc;
@@ -287,7 +287,7 @@ static ssize_t filesfree_show(struct kobject *kobj, struct attribute *attr,
 	int rc;
 
 	rc = ll_statfs_internal(sbi, &osfs,
-				get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
+				ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
 				OBD_STATFS_NODELAY);
 	if (rc)
 		return rc;
diff --git a/fs/lustre/lmv/lmv_obd.c b/fs/lustre/lmv/lmv_obd.c
index 9a1064b..d0f626f 100644
--- a/fs/lustre/lmv/lmv_obd.c
+++ b/fs/lustre/lmv/lmv_obd.c
@@ -893,7 +893,7 @@ static int lmv_iocontrol(unsigned int cmd, struct obd_export *exp,
 			return -EFAULT;
 
 		rc = obd_statfs(NULL, tgt->ltd_exp, &stat_buf,
-				get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
+				ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
 				0);
 		if (rc)
 			return rc;
@@ -1326,7 +1326,7 @@ static int lmv_process_config(struct obd_device *obd, u32 len, void *buf)
 }
 
 static int lmv_statfs(const struct lu_env *env, struct obd_export *exp,
-		      struct obd_statfs *osfs, u64 max_age, u32 flags)
+		      struct obd_statfs *osfs, time64_t max_age, u32 flags)
 {
 	struct obd_device *obd = class_exp2obd(exp);
 	struct lmv_obd *lmv = &obd->u.lmv;
diff --git a/fs/lustre/lov/lov_obd.c b/fs/lustre/lov/lov_obd.c
index acfee93..1708fa9 100644
--- a/fs/lustre/lov/lov_obd.c
+++ b/fs/lustre/lov/lov_obd.c
@@ -915,7 +915,7 @@ int lov_process_config_base(struct obd_device *obd, struct lustre_cfg *lcfg,
 }
 
 static int lov_statfs(const struct lu_env *env, struct obd_export *exp,
-		      struct obd_statfs *osfs, u64 max_age, u32 flags)
+		      struct obd_statfs *osfs, time64_t max_age, u32 flags)
 {
 	struct obd_device *obd = class_exp2obd(exp);
 	struct lov_obd *lov = &obd->u.lov;
@@ -1001,7 +1001,7 @@ static int lov_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
 
 		/* got statfs data */
 		rc = obd_statfs(NULL, lov->lov_tgts[index]->ltd_exp, &stat_buf,
-				get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
+				ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
 				flags);
 		if (rc)
 			return rc;
diff --git a/fs/lustre/lov/lov_request.c b/fs/lustre/lov/lov_request.c
index 057d6ca..864e410 100644
--- a/fs/lustre/lov/lov_request.c
+++ b/fs/lustre/lov/lov_request.c
@@ -158,7 +158,7 @@ static int lov_fini_statfs(struct obd_device *obd, struct obd_statfs *osfs,
 
 		spin_lock(&obd->obd_osfs_lock);
 		memcpy(&obd->obd_osfs, osfs, sizeof(*osfs));
-		obd->obd_osfs_age = get_jiffies_64();
+		obd->obd_osfs_age = ktime_get_seconds();
 		spin_unlock(&obd->obd_osfs_lock);
 		return 0;
 	}
@@ -275,7 +275,7 @@ static int cb_statfs_update(void *cookie, int rc)
 	spin_lock(&tgtobd->obd_osfs_lock);
 	memcpy(&tgtobd->obd_osfs, lov_sfs, sizeof(*lov_sfs));
 	if ((oinfo->oi_flags & OBD_STATFS_FROM_CACHE) == 0)
-		tgtobd->obd_osfs_age = get_jiffies_64();
+		tgtobd->obd_osfs_age = ktime_get_seconds();
 	spin_unlock(&tgtobd->obd_osfs_lock);
 
 out_update:
diff --git a/fs/lustre/mdc/mdc_request.c b/fs/lustre/mdc/mdc_request.c
index 95698c3..dd9ab5a 100644
--- a/fs/lustre/mdc/mdc_request.c
+++ b/fs/lustre/mdc/mdc_request.c
@@ -1439,7 +1439,7 @@ static int mdc_read_page(struct obd_export *exp, struct md_op_data *op_data,
 
 static int mdc_statfs(const struct lu_env *env,
 		      struct obd_export *exp, struct obd_statfs *osfs,
-		      u64 max_age, u32 flags)
+		      time64_t max_age, u32 flags)
 {
 	struct obd_device *obd = class_exp2obd(exp);
 	struct ptlrpc_request *req;
@@ -2002,7 +2002,7 @@ static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
 		}
 
 		rc = mdc_statfs(NULL, obd->obd_self_export, &stat_buf,
-				get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
+				ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
 				0);
 		if (rc != 0)
 			goto out;
diff --git a/fs/lustre/obdclass/genops.c b/fs/lustre/obdclass/genops.c
index 6491032..f809d00c 100644
--- a/fs/lustre/obdclass/genops.c
+++ b/fs/lustre/obdclass/genops.c
@@ -307,7 +307,7 @@ struct obd_device *class_newdev(const char *type_name, const char *name,
 	/* newdev->obd_osfs_age must be set to a value in the distant
 	 * past to guarantee a fresh statfs is fetched on mount.
 	 */
-	newdev->obd_osfs_age = get_jiffies_64() - 1000 * HZ;
+	newdev->obd_osfs_age = ktime_get_seconds() - 1000;
 
 	/* XXX belongs in setup not attach  */
 	init_rwsem(&newdev->obd_observer_link_sem);
diff --git a/fs/lustre/obdclass/lprocfs_status.c b/fs/lustre/obdclass/lprocfs_status.c
index dbbaa92..135926e 100644
--- a/fs/lustre/obdclass/lprocfs_status.c
+++ b/fs/lustre/obdclass/lprocfs_status.c
@@ -351,9 +351,11 @@ static ssize_t blocksize_show(struct kobject *kobj, struct attribute *attr,
 	struct obd_device *obd = container_of(kobj, struct obd_device,
 					      obd_kset.kobj);
 	struct obd_statfs osfs;
-	int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
-			    get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
-			    OBD_STATFS_NODELAY);
+	int rc;
+
+	rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
+			ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
+			OBD_STATFS_NODELAY);
 	if (!rc)
 		return sprintf(buf, "%u\n", osfs.os_bsize);
 
@@ -367,9 +369,11 @@ static ssize_t kbytestotal_show(struct kobject *kobj, struct attribute *attr,
 	struct obd_device *obd = container_of(kobj, struct obd_device,
 					      obd_kset.kobj);
 	struct obd_statfs osfs;
-	int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
-			    get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
-			    OBD_STATFS_NODELAY);
+	int rc;
+
+	rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
+			ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
+			OBD_STATFS_NODELAY);
 	if (!rc) {
 		u32 blk_size = osfs.os_bsize >> 10;
 		u64 result = osfs.os_blocks;
@@ -388,9 +392,11 @@ static ssize_t kbytesfree_show(struct kobject *kobj, struct attribute *attr,
 	struct obd_device *obd = container_of(kobj, struct obd_device,
 					      obd_kset.kobj);
 	struct obd_statfs osfs;
-	int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
-			    get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
-			    OBD_STATFS_NODELAY);
+	int rc;
+
+	rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
+			ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
+			OBD_STATFS_NODELAY);
 	if (!rc) {
 		u32 blk_size = osfs.os_bsize >> 10;
 		u64 result = osfs.os_bfree;
@@ -410,9 +416,11 @@ static ssize_t kbytesavail_show(struct kobject *kobj, struct attribute *attr,
 	struct obd_device *obd = container_of(kobj, struct obd_device,
 					      obd_kset.kobj);
 	struct obd_statfs osfs;
-	int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
-			    get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
-			    OBD_STATFS_NODELAY);
+	int rc;
+
+	rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
+			ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
+			OBD_STATFS_NODELAY);
 	if (!rc) {
 		u32 blk_size = osfs.os_bsize >> 10;
 		u64 result = osfs.os_bavail;
@@ -432,9 +440,11 @@ static ssize_t filestotal_show(struct kobject *kobj, struct attribute *attr,
 	struct obd_device *obd = container_of(kobj, struct obd_device,
 					      obd_kset.kobj);
 	struct obd_statfs osfs;
-	int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
-			    get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
-			    OBD_STATFS_NODELAY);
+	int rc;
+
+	rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
+			ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
+			OBD_STATFS_NODELAY);
 	if (!rc)
 		return sprintf(buf, "%llu\n", osfs.os_files);
 
@@ -448,9 +458,11 @@ static ssize_t filesfree_show(struct kobject *kobj, struct attribute *attr,
 	struct obd_device *obd = container_of(kobj, struct obd_device,
 					      obd_kset.kobj);
 	struct obd_statfs osfs;
-	int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
-			    get_jiffies_64() - OBD_STATFS_CACHE_SECONDS * HZ,
-			    OBD_STATFS_NODELAY);
+	int rc;
+
+	rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
+			ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
+			OBD_STATFS_NODELAY);
 	if (!rc)
 		return sprintf(buf, "%llu\n", osfs.os_ffree);
 
diff --git a/fs/lustre/osc/osc_request.c b/fs/lustre/osc/osc_request.c
index 0f7ac2d..5797535 100644
--- a/fs/lustre/osc/osc_request.c
+++ b/fs/lustre/osc/osc_request.c
@@ -2471,7 +2471,7 @@ static int osc_statfs_interpret(const struct lu_env *env,
 }
 
 static int osc_statfs_async(struct obd_export *exp,
-			    struct obd_info *oinfo, u64 max_age,
+			    struct obd_info *oinfo, time64_t max_age,
 			    struct ptlrpc_request_set *rqset)
 {
 	struct obd_device *obd = class_exp2obd(exp);
@@ -2515,7 +2515,7 @@ static int osc_statfs_async(struct obd_export *exp,
 }
 
 static int osc_statfs(const struct lu_env *env, struct obd_export *exp,
-		      struct obd_statfs *osfs, u64 max_age, u32 flags)
+		      struct obd_statfs *osfs, time64_t max_age, u32 flags)
 {
 	struct obd_device *obd = class_exp2obd(exp);
 	struct obd_statfs *msfs;
diff --git a/fs/lustre/ptlrpc/import.c b/fs/lustre/ptlrpc/import.c
index 3c56798..152a84c 100644
--- a/fs/lustre/ptlrpc/import.c
+++ b/fs/lustre/ptlrpc/import.c
@@ -462,7 +462,7 @@ static int import_select_connection(struct obd_import *imp)
 	}
 
 	list_for_each_entry(conn, &imp->imp_conn_list, oic_item) {
-		CDEBUG(D_HA, "%s: connect to NID %s last attempt %llu\n",
+		CDEBUG(D_HA, "%s: connect to NID %s last attempt %lld\n",
 		       imp->imp_obd->obd_name,
 		       libcfs_nid2str(conn->oic_conn->c_peer.nid),
 		       conn->oic_last_attempt);
@@ -471,8 +471,7 @@ static int import_select_connection(struct obd_import *imp)
 		 * the last successful attempt, go with this one
 		 */
 		if ((conn->oic_last_attempt == 0) ||
-		    time_before_eq64(conn->oic_last_attempt,
-				     imp->imp_last_success_conn)) {
+		    conn->oic_last_attempt <= imp->imp_last_success_conn) {
 			imp_conn = conn;
 			tried_all = 0;
 			break;
@@ -484,8 +483,7 @@ static int import_select_connection(struct obd_import *imp)
 		 */
 		if (!imp_conn)
 			imp_conn = conn;
-		else if (time_before64(conn->oic_last_attempt,
-					    imp_conn->oic_last_attempt))
+		else if (imp_conn->oic_last_attempt > conn->oic_last_attempt)
 			imp_conn = conn;
 	}
 
@@ -517,7 +515,7 @@ static int import_select_connection(struct obd_import *imp)
 		       imp->imp_obd->obd_name, at_get(at));
 	}
 
-	imp_conn->oic_last_attempt = get_jiffies_64();
+	imp_conn->oic_last_attempt = ktime_get_seconds();
 
 	/* switch connection, don't mind if it's same as the current one */
 	ptlrpc_connection_put(imp->imp_connection);
-- 
1.8.3.1

  parent reply	other threads:[~2019-09-30 18:56 UTC|newest]

Thread overview: 165+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-30 18:54 [lustre-devel] [PATCH 000/151] lustre: update to 2.11 support James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 001/151] lnet: fix needed headers for lnet headers James Simmons
2019-10-01  7:24   ` NeilBrown
2019-10-01 17:52     ` James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 002/151] lustre: fix signal handling in abortable waits James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 003/151] lnet: ksocklnd: add secondary IP address handling James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 004/151] lnet: o2iblnd: " James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 005/151] lnet: consoldate " James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 006/151] lustre: support for gcc8 James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 007/151] lnet: Allocate MEs and small MDs in own kmem_caches James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 008/151] lustre: seq: make seq_proc_write_common() safer James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 009/151] lustre: ptlrpc: Fix an rq_no_reply assertion failure James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 010/151] lustre: fld: resend seq lookup RPC if it is on LWP James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 011/151] lustre: fld: retry fld rpc even for ESHUTDOWN James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 012/151] lustre: fld: retry fld rpc until the import is closed James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 013/151] lustre: fld: fld client lookup should retry James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 014/151] lustre: ldlm: testcases for multiple modify RPCs feature James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 015/151] lustre: ldlm: Don't check opcode with NULL rq_reqmsg James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 016/151] lustre: all: remove all Sun license and URL references James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 017/151] lustre: ldlm: Use interval tree to update kms James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 018/151] lustre: osc: prepare OSC code to be used from MDC James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 019/151] lustre: statahead: support striped directory James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 020/151] lustre: readdir: improve striped readdir James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 021/151] lustre: llog: consolidate common error checking James Simmons
2019-10-01  1:29   ` NeilBrown
2019-10-01 17:51     ` James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 022/151] lustre: llite: NULL pointer dereference in cl_object_top() James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 023/151] lustre: ptlrpc: remove incorrect pid printing James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 024/151] lnet: Fix lost lock James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 025/151] lustre: llite: Reduce overhead for ll_do_fast_read James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 026/151] lustre: ptlrpc: change cr_sent_tv from timespec to ktime James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 027/151] lustre: ptlrpc: Use C99 initializer in ptlrpc_register_rqbd() James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 028/151] lustre: lmv: stripe dir page may be released mistakenly James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 029/151] lnet: selftest: Use C99 struct initializer in framework.c James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 030/151] lnet: fix memory leak and lnet_interfaces_max James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 031/151] lnet: decref on peer after use James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 032/151] lnet: rediscover peer if it changed James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 033/151] lnet: resolve unsafe list access James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 034/151] lustre: llite: Implement ladvise lockahead James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 035/151] lustre: jobstats: move jobstats code into separate file James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 036/151] lustre: ldlm: don't use jiffies as sysfs parameter James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 037/151] lnet: Handle ping buffer with only loopback NID James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 038/151] lustre: llite: enable readahead for small read_ahead_per_file James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 039/151] lnet: don't discover loopback interface James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 040/151] lnet: reduce logging severity James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 041/151] lustre: ptlrpc: migrate pinger to 64 bit time James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 042/151] lustre: mdc: add cl_device to the MDC James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 043/151] lustre: lov: add MDT target to the LOV device James Simmons
2019-10-01  0:33   ` NeilBrown
2019-10-01 18:03     ` James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 044/151] lustre: mdt: IO request handling in MDT James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 045/151] lustre: osc: common client setup/cleanup James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 046/151] lustre: mdc: add IO methods to the MDC James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 047/151] lustre: lvbo: pass lock as parameter to lvbo_update() James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 048/151] lustre: mds: add IO locking to the MDC and MDT James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 049/151] lustre: mdc: add IO stats in mdc James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 050/151] lustre: lov: add Data-on-MDT tests and fixes James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 051/151] lustre: mdc: use generic grant code at MDT James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 052/151] lustre: mds: combine DoM bit with other IBITS James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 053/151] lustre: llite: increase whole-file readahead to RPC size James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 054/151] lustre: ldlm: remove liblustre remnants James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 055/151] lustre: misc: replace LASSERT() with BUILD_BUG_ON() James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 056/151] lustre: llite: check layout size after cl_object_layout_get James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 057/151] lustre: mdc: implement own mdc_io_fsync_start() James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 058/151] lustre: ldlm: migrate the rest of the code to 64 bit time James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 059/151] lustre: llite: sync bdi sysfs name with lustre sysfs tree James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 060/151] lustre: lov: allow lov.*.stripe{size, count}=-1 param James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 061/151] lustre: brw: add short io osc/ost transfer James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 062/151] lustre: lov: take lov layout lock for I/O with ignore_layout James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 063/151] lustre: lov: pack lsm_flags from layout James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 064/151] lustre: clio: introduce CIT_GLIMPSE for glimpse James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 065/151] lustre: flr: add infrastructure to create a new mirror James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 066/151] lustre: clio: no glimpse for data immutable file James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 067/151] lustre: flr: read support for flr James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 068/151] lustre: lov: rework write intent on componect instantiation James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 069/151] lustre: ptlrpc: use lu_extent in layout_intent James Simmons
2019-10-01  3:26   ` NeilBrown
2019-10-01 17:54     ` James Simmons
2019-10-01 23:19       ` NeilBrown
2019-10-04 20:39       ` Cory Spitz
2019-09-30 18:55 ` [lustre-devel] [PATCH 070/151] lustre: flr: Send write intent RPC to mdt James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 071/151] lustre: flr: extend DATA_VERSION API to read layout version James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 072/151] lustre: lov: skip empty pages in lov_io_submit() James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 073/151] lustre: mdc: don't assert on name pack James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 074/151] lustre: flr: mirror read and write James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 075/151] lustre: flr: resync support and test tool James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 076/151] lustre: flr: randomize mirror pick James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 077/151] lustre: flr: instantiate component for truncate James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 078/151] lustre: hsm: don't release with wrong size James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 079/151] lustre: mdc: Add an additional set of 64 changelog flags James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 080/151] lustre: ldlm: assume OBD_CONNECT_IBITS James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 081/151] lustre: llite: assume OBD_CONNECT_ATTRFID James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 082/151] lustre: llite: simplify ll_inode_revalidate() James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 083/151] lustre: obd: free obd_svc_stats when all users are gone James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 084/151] lustre: mdc: add uid/gid to Changelogs entries James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 085/151] lustre: scrub: general framework for OI scrub James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 086/151] lustre: idl: clean up and document ptlrpc structures James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 087/151] lustre: idl: remove obsolete RPC MSG flags James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 088/151] lnet: libcfs: call proper crypto algo when keys are passed in James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 089/151] lustre: clio: remove unused cl_lock layers James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 090/151] lustre: sec: migrate to 64 bit time James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 091/151] lustre: llite: avoid live-lock when concurrent mmap()s James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 092/151] lustre: llite: change lli_glimpse_time to ktime James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 093/151] lustre: hsm: filter kkuc write by client UUID James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 094/151] lustre: dne: allow mkdir with specific MDTs James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 095/151] lustre: misc: update Intel copyright messages for 2017 James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 096/151] lustre: fid: improve seq allocation error messages James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 097/151] lustre: mdc: interruptable during RPC retry for EINPROGRESS James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 098/151] lustre: osc: migrate to 64 bit time James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 099/151] lustre: vvp: Print discarded page warning on -EIO James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 100/151] lustre: clio: Use readahead for partial page write James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 101/151] lustre: flr: comp-flags support when creating mirrors James Simmons
2019-09-30 18:56 ` James Simmons [this message]
2019-09-30 18:56 ` [lustre-devel] [PATCH 103/151] lustre: address issues raised by gcc7 James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 104/151] lustre: lov: fill no-extent fiemap on object with no stripe James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 105/151] lustre: ptlrpc: allow to limit number of service's rqbds James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 106/151] lnet: ensure peer put back on dc request queue James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 107/151] lustre: recovery: support setstripe replay James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 108/151] lustre: lustre: move LA_* flags to lustre_user.h James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 109/151] lustre: flr: revise lease API James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 110/151] lustre: idl: add PTLRPC definitions to enum James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 111/151] lustre: obd: remove s2dhms time function James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 112/151] lustre: mdc: add client NID to Changelogs entries James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 113/151] lustre: mdc: implement CL_OPEN for Changelogs James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 114/151] lustre: acl: prepare small buffer for ACL RPC reply James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 115/151] lnet: safe access in debug print James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 116/151] lnet: Remove LASSERT on userspace data James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 117/151] lustre: flr: split a mirror from mirrored file James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 118/151] lustre: llite: deny 2.10 clients to open mirrored files James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 119/151] lustre: uapi: rename LCM_FL_NOT_FLR to LCM_FL_NONE James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 120/151] lustre: flr: layout truncate compatibility James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 121/151] lustre: mdc: high-priority request handling for DOM James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 122/151] lustre: llite: Add tiny write support James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 123/151] lustre: mdc: add CL_GETXATTR for Changelogs James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 124/151] lustre: uapi: record denied OPEN in Changelogs James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 125/151] lustre: llite: have ll_write_end to sync for DIO James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 126/151] lustre: obd: add check to obd_statfs James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 127/151] lustre: obd: fix statfs handling James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 128/151] lustre: dom: support DATA_VERSION IO type James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 129/151] lnet: fix contiguous range support James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 130/151] lustre: osc: add a bit to indicate osc_page in cache tree James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 131/151] lustre: ldlm: fix export reference James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 132/151] lustre: llite: Add exit for filedata allocation failed James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 133/151] lustre: misc: Wrong checksum return value James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 134/151] lustre: llite: fix mount error handing James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 135/151] lustre: llite: Disable tiny writes for append James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 136/151] lustre: uapi: replace FMODE_{READ, WRITE} with MDS_* equivs James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 137/151] lnet: reduce discovery timeout James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 138/151] lustre: update version to 2.10.99 James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 139/151] lustre: ptlrpc: clarify 64 bit time usage James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 140/151] lustre: ptlrpc: add watchdog for ptlrpc service threads James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 141/151] lustre: handles: discard h_owner in favour of h_ops James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 142/151] lustre: ldlm: Remove use of SLAB_DESTROY_BY_RCU for ldlm lock slab James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 143/151] lustre: ldlm: simplify lock_mode_to_index() James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 144/151] lustre: ptlrpc: use list_move where appropriate James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 145/151] lustre: ptlrpc: simplify locking in ptlrpc_add_rqs_to_pool() James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 146/151] lustre: ptlrpc: incorporate BUILD_BUG_ON into ptlrpc_req_async_args() James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 147/151] lustre: introduce CONFIG_LUSTRE_FS_POSIX_ACL James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 148/151] lustre: ptlrpc: discard a server-only waitq James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 149/151] lustre: llite: remove // comments James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 150/151] lustre: remove outdated comments about ->ap_* functions James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 151/151] lustre: clean up some comment alignment James Simmons
2019-10-01  7:01 ` [lustre-devel] [PATCH 000/151] lustre: update to 2.11 support NeilBrown
2019-10-01 18:07   ` James Simmons
2019-10-02  0:52     ` NeilBrown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1569869810-23848-103-git-send-email-jsimmons@infradead.org \
    --to=jsimmons@infradead.org \
    --cc=lustre-devel@lists.lustre.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).