linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Tejun Heo <tj@kernel.org>
To: gregkh@linuxfoundation.org
Cc: kay@vrfy.org, linux-kernel@vger.kernel.org,
	ebiederm@xmission.com, bhelgaas@google.com,
	Tejun Heo <tj@kernel.org>
Subject: [PATCH 22/34] sysfs, kernfs: move symlink core code to fs/kernfs/symlink.c
Date: Thu, 28 Nov 2013 14:54:35 -0500	[thread overview]
Message-ID: <1385668487-10181-23-git-send-email-tj@kernel.org> (raw)
In-Reply-To: <1385668487-10181-1-git-send-email-tj@kernel.org>

Move core symlink code to fs/kernfs/symlink.c.  fs/sysfs/symlink.c now
only contains sysfs wrappers around kernfs interfaces.  The respective
declarations in fs/sysfs/sysfs.h are moved to
fs/kernfs/kernfs-internal.h.

This is pure relocation.

Signed-off-by: Tejun Heo <tj@kernel.org>
---
 fs/kernfs/kernfs-internal.h |   5 ++
 fs/kernfs/symlink.c         | 139 ++++++++++++++++++++++++++++++++++++++++++++
 fs/sysfs/symlink.c          | 137 -------------------------------------------
 fs/sysfs/sysfs.h            |   1 -
 4 files changed, 144 insertions(+), 138 deletions(-)

diff --git a/fs/kernfs/kernfs-internal.h b/fs/kernfs/kernfs-internal.h
index 38e3a16..62ae35f 100644
--- a/fs/kernfs/kernfs-internal.h
+++ b/fs/kernfs/kernfs-internal.h
@@ -149,4 +149,9 @@ extern const struct file_operations kernfs_file_operations;
 
 void sysfs_unmap_bin_file(struct sysfs_dirent *sd);
 
+/*
+ * symlink.c
+ */
+extern const struct inode_operations sysfs_symlink_inode_operations;
+
 #endif	/* __KERNFS_INTERNAL_H */
diff --git a/fs/kernfs/symlink.c b/fs/kernfs/symlink.c
index 2578715..af3570b 100644
--- a/fs/kernfs/symlink.c
+++ b/fs/kernfs/symlink.c
@@ -7,3 +7,142 @@
  *
  * This file is released under the GPLv2.
  */
+
+#include <linux/fs.h>
+#include <linux/gfp.h>
+#include <linux/namei.h>
+
+#include "kernfs-internal.h"
+
+/**
+ * kernfs_create_link - create a symlink
+ * @parent: directory to create the symlink in
+ * @name: name of the symlink
+ * @target: target node for the symlink to point to
+ *
+ * Returns the created node on success, ERR_PTR() value on error.
+ */
+struct sysfs_dirent *kernfs_create_link(struct sysfs_dirent *parent,
+					const char *name,
+					struct sysfs_dirent *target)
+{
+	struct sysfs_dirent *sd;
+	struct sysfs_addrm_cxt acxt;
+	int error;
+
+	sd = sysfs_new_dirent(name, S_IFLNK|S_IRWXUGO, SYSFS_KOBJ_LINK);
+	if (!sd)
+		return ERR_PTR(-ENOMEM);
+
+	if (parent->s_flags & SYSFS_FLAG_NS)
+		sd->s_ns = target->s_ns;
+	sd->s_symlink.target_sd = target;
+	kernfs_get(target);	/* ref owned by symlink */
+
+	sysfs_addrm_start(&acxt);
+	error = sysfs_add_one(&acxt, sd, parent);
+	sysfs_addrm_finish(&acxt);
+
+	if (!error)
+		return sd;
+
+	kernfs_put(sd);
+	return ERR_PTR(error);
+}
+
+static int sysfs_get_target_path(struct sysfs_dirent *parent_sd,
+				 struct sysfs_dirent *target_sd, char *path)
+{
+	struct sysfs_dirent *base, *sd;
+	char *s = path;
+	int len = 0;
+
+	/* go up to the root, stop at the base */
+	base = parent_sd;
+	while (base->s_parent) {
+		sd = target_sd->s_parent;
+		while (sd->s_parent && base != sd)
+			sd = sd->s_parent;
+
+		if (base == sd)
+			break;
+
+		strcpy(s, "../");
+		s += 3;
+		base = base->s_parent;
+	}
+
+	/* determine end of target string for reverse fillup */
+	sd = target_sd;
+	while (sd->s_parent && sd != base) {
+		len += strlen(sd->s_name) + 1;
+		sd = sd->s_parent;
+	}
+
+	/* check limits */
+	if (len < 2)
+		return -EINVAL;
+	len--;
+	if ((s - path) + len > PATH_MAX)
+		return -ENAMETOOLONG;
+
+	/* reverse fillup of target string from target to base */
+	sd = target_sd;
+	while (sd->s_parent && sd != base) {
+		int slen = strlen(sd->s_name);
+
+		len -= slen;
+		strncpy(s + len, sd->s_name, slen);
+		if (len)
+			s[--len] = '/';
+
+		sd = sd->s_parent;
+	}
+
+	return 0;
+}
+
+static int sysfs_getlink(struct dentry *dentry, char *path)
+{
+	struct sysfs_dirent *sd = dentry->d_fsdata;
+	struct sysfs_dirent *parent_sd = sd->s_parent;
+	struct sysfs_dirent *target_sd = sd->s_symlink.target_sd;
+	int error;
+
+	mutex_lock(&sysfs_mutex);
+	error = sysfs_get_target_path(parent_sd, target_sd, path);
+	mutex_unlock(&sysfs_mutex);
+
+	return error;
+}
+
+static void *sysfs_follow_link(struct dentry *dentry, struct nameidata *nd)
+{
+	int error = -ENOMEM;
+	unsigned long page = get_zeroed_page(GFP_KERNEL);
+	if (page) {
+		error = sysfs_getlink(dentry, (char *) page);
+		if (error < 0)
+			free_page((unsigned long)page);
+	}
+	nd_set_link(nd, error ? ERR_PTR(error) : (char *)page);
+	return NULL;
+}
+
+static void sysfs_put_link(struct dentry *dentry, struct nameidata *nd,
+			   void *cookie)
+{
+	char *page = nd_get_link(nd);
+	if (!IS_ERR(page))
+		free_page((unsigned long)page);
+}
+
+const struct inode_operations sysfs_symlink_inode_operations = {
+	.setxattr	= sysfs_setxattr,
+	.readlink	= generic_readlink,
+	.follow_link	= sysfs_follow_link,
+	.put_link	= sysfs_put_link,
+	.setattr	= sysfs_setattr,
+	.getattr	= sysfs_getattr,
+	.permission	= sysfs_permission,
+};
diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c
index b137aa3..6797c9c 100644
--- a/fs/sysfs/symlink.c
+++ b/fs/sysfs/symlink.c
@@ -11,53 +11,13 @@
  */
 
 #include <linux/fs.h>
-#include <linux/gfp.h>
-#include <linux/mount.h>
 #include <linux/module.h>
 #include <linux/kobject.h>
-#include <linux/namei.h>
 #include <linux/mutex.h>
 #include <linux/security.h>
 
 #include "sysfs.h"
 
-/**
- * kernfs_create_link - create a symlink
- * @parent: directory to create the symlink in
- * @name: name of the symlink
- * @target: target node for the symlink to point to
- *
- * Returns the created node on success, ERR_PTR() value on error.
- */
-struct sysfs_dirent *kernfs_create_link(struct sysfs_dirent *parent,
-					const char *name,
-					struct sysfs_dirent *target)
-{
-	struct sysfs_dirent *sd;
-	struct sysfs_addrm_cxt acxt;
-	int error;
-
-	sd = sysfs_new_dirent(name, S_IFLNK|S_IRWXUGO, SYSFS_KOBJ_LINK);
-	if (!sd)
-		return ERR_PTR(-ENOMEM);
-
-	if (parent->s_flags & SYSFS_FLAG_NS)
-		sd->s_ns = target->s_ns;
-	sd->s_symlink.target_sd = target;
-	kernfs_get(target);	/* ref owned by symlink */
-
-	sysfs_addrm_start(&acxt);
-	error = sysfs_add_one(&acxt, sd, parent);
-	sysfs_addrm_finish(&acxt);
-
-	if (!error)
-		return sd;
-
-	kernfs_put(sd);
-	return ERR_PTR(error);
-}
-
-
 static int sysfs_do_create_link_sd(struct sysfs_dirent *parent_sd,
 				   struct kobject *target,
 				   const char *name, int warn)
@@ -235,100 +195,3 @@ out:
 	return result;
 }
 EXPORT_SYMBOL_GPL(sysfs_rename_link_ns);
-
-static int sysfs_get_target_path(struct sysfs_dirent *parent_sd,
-				 struct sysfs_dirent *target_sd, char *path)
-{
-	struct sysfs_dirent *base, *sd;
-	char *s = path;
-	int len = 0;
-
-	/* go up to the root, stop at the base */
-	base = parent_sd;
-	while (base->s_parent) {
-		sd = target_sd->s_parent;
-		while (sd->s_parent && base != sd)
-			sd = sd->s_parent;
-
-		if (base == sd)
-			break;
-
-		strcpy(s, "../");
-		s += 3;
-		base = base->s_parent;
-	}
-
-	/* determine end of target string for reverse fillup */
-	sd = target_sd;
-	while (sd->s_parent && sd != base) {
-		len += strlen(sd->s_name) + 1;
-		sd = sd->s_parent;
-	}
-
-	/* check limits */
-	if (len < 2)
-		return -EINVAL;
-	len--;
-	if ((s - path) + len > PATH_MAX)
-		return -ENAMETOOLONG;
-
-	/* reverse fillup of target string from target to base */
-	sd = target_sd;
-	while (sd->s_parent && sd != base) {
-		int slen = strlen(sd->s_name);
-
-		len -= slen;
-		strncpy(s + len, sd->s_name, slen);
-		if (len)
-			s[--len] = '/';
-
-		sd = sd->s_parent;
-	}
-
-	return 0;
-}
-
-static int sysfs_getlink(struct dentry *dentry, char *path)
-{
-	struct sysfs_dirent *sd = dentry->d_fsdata;
-	struct sysfs_dirent *parent_sd = sd->s_parent;
-	struct sysfs_dirent *target_sd = sd->s_symlink.target_sd;
-	int error;
-
-	mutex_lock(&sysfs_mutex);
-	error = sysfs_get_target_path(parent_sd, target_sd, path);
-	mutex_unlock(&sysfs_mutex);
-
-	return error;
-}
-
-static void *sysfs_follow_link(struct dentry *dentry, struct nameidata *nd)
-{
-	int error = -ENOMEM;
-	unsigned long page = get_zeroed_page(GFP_KERNEL);
-	if (page) {
-		error = sysfs_getlink(dentry, (char *) page);
-		if (error < 0)
-			free_page((unsigned long)page);
-	}
-	nd_set_link(nd, error ? ERR_PTR(error) : (char *)page);
-	return NULL;
-}
-
-static void sysfs_put_link(struct dentry *dentry, struct nameidata *nd,
-			   void *cookie)
-{
-	char *page = nd_get_link(nd);
-	if (!IS_ERR(page))
-		free_page((unsigned long)page);
-}
-
-const struct inode_operations sysfs_symlink_inode_operations = {
-	.setxattr	= sysfs_setxattr,
-	.readlink	= generic_readlink,
-	.follow_link	= sysfs_follow_link,
-	.put_link	= sysfs_put_link,
-	.setattr	= sysfs_setattr,
-	.getattr	= sysfs_getattr,
-	.permission	= sysfs_permission,
-};
diff --git a/fs/sysfs/sysfs.h b/fs/sysfs/sysfs.h
index 4b8b60d..6d0dcea 100644
--- a/fs/sysfs/sysfs.h
+++ b/fs/sysfs/sysfs.h
@@ -50,7 +50,6 @@ int sysfs_add_file_mode_ns(struct sysfs_dirent *dir_sd,
 /*
  * symlink.c
  */
-extern const struct inode_operations sysfs_symlink_inode_operations;
 int sysfs_create_link_sd(struct sysfs_dirent *sd, struct kobject *target,
 			 const char *name);
 
-- 
1.8.4.2


  parent reply	other threads:[~2013-11-28 19:59 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-23 22:21 [PATCHSET driver-core-next] sysfs: separate out kernfs, take #3 Tejun Heo
2013-11-23 22:21 ` [PATCH 01/41] sysfs: drop kobj_ns_type handling, take #2 Tejun Heo
2013-11-23 23:05   ` [PATCH v2 " Tejun Heo
2013-11-23 22:21 ` [PATCH 02/41] sysfs: make __sysfs_add_one() fail if the parent isn't a directory Tejun Heo
2013-11-23 22:21 ` [PATCH 03/41] sysfs, kernfs: add skeletons for kernfs Tejun Heo
2013-11-24 14:54   ` [PATCH REPOST " Tejun Heo
2013-11-23 22:21 ` [PATCH 04/41] sysfs, kernfs: introduce kernfs_remove[_by_name[_ns]]() Tejun Heo
2013-11-23 22:21 ` [PATCH 05/41] sysfs, kernfs: introduce kernfs_create_link() Tejun Heo
2013-11-23 22:21 ` [PATCH 06/41] sysfs, kernfs: introduce kernfs_rename[_ns]() Tejun Heo
2013-11-23 22:21 ` [PATCH 07/41] sysfs, kernfs: introduce kernfs_setattr() Tejun Heo
2013-11-23 22:21 ` [PATCH 08/41] sysfs, kernfs: replace sysfs_dirent->s_dir.kobj and ->s_attr.[bin_]attr with ->priv Tejun Heo
2013-11-23 22:21 ` [PATCH 09/41] sysfs, kernfs: introduce kernfs_create_dir[_ns]() Tejun Heo
2013-11-23 23:07   ` [PATCH v4 " Tejun Heo
2013-11-28  6:05     ` Greg KH
2013-11-28 19:54       ` [PATCHSET PARTIAL REPOST driver-core-next] sysfs: separate out kernfs, take #3 Tejun Heo
2013-11-28 19:54         ` [PATCH 01/34] sysfs, kernfs: replace sysfs_dirent->s_dir.kobj and ->s_attr.[bin_]attr with ->priv Tejun Heo
2013-11-28 19:54         ` [PATCH 02/34] sysfs, kernfs: introduce kernfs_create_dir[_ns]() Tejun Heo
2013-11-28 19:54         ` [PATCH 03/34] sysfs, kernfs: prepare read path for kernfs Tejun Heo
2013-11-28 19:54         ` [PATCH 04/34] sysfs, kernfs: prepare write " Tejun Heo
2013-11-28 19:54         ` [PATCH 05/34] sysfs, kernfs: prepare mmap " Tejun Heo
2013-11-28 19:54         ` [PATCH 06/34] sysfs, kernfs: prepare open, release, poll paths " Tejun Heo
2013-11-28 19:54         ` [PATCH 07/34] sysfs, kernfs: move sysfs_open_file to include/linux/kernfs.h Tejun Heo
2013-11-28 19:54         ` [PATCH 08/34] sysfs, kernfs: introduce kernfs_ops Tejun Heo
2013-11-28 19:54         ` [PATCH 09/34] sysfs, kernfs: add sysfs_dirent->s_attr.size Tejun Heo
2013-11-28 19:54         ` [PATCH 10/34] sysfs, kernfs: remove SYSFS_KOBJ_BIN_ATTR Tejun Heo
2013-11-28 19:54         ` [PATCH 11/34] sysfs, kernfs: introduce kernfs_create_file[_ns]() Tejun Heo
2013-11-28 19:54         ` [PATCH 12/34] sysfs, kernfs: remove sysfs_add_one() Tejun Heo
2013-11-28 19:54         ` [PATCH 13/34] sysfs, kernfs: add kernfs_ops->seq_{start|next|stop}() Tejun Heo
2013-11-28 19:54         ` [PATCH 14/34] sysfs, kernfs: introduce kernfs_notify() Tejun Heo
2013-11-28 19:54         ` [PATCH 15/34] sysfs, kernfs: reorganize SYSFS_* constants Tejun Heo
2013-11-28 19:54         ` [PATCH 16/34] sysfs, kernfs: revamp sysfs_dirent active_ref lockdep annotation Tejun Heo
2013-11-28 19:54         ` [PATCH 17/34] sysfs, kernfs: introduce kernfs[_find_and]_get() and kernfs_put() Tejun Heo
2013-11-28 19:54         ` [PATCH 18/34] sysfs, kernfs: move internal decls to fs/kernfs/kernfs-internal.h Tejun Heo
2013-11-28 19:54         ` [PATCH 19/34] sysfs, kernfs: move inode code to fs/kernfs/inode.c Tejun Heo
2013-11-28 19:54         ` [PATCH 20/34] sysfs, kernfs: move dir core code to fs/kernfs/dir.c Tejun Heo
2013-11-28 19:54         ` [PATCH 21/34] sysfs, kernfs: move file core code to fs/kernfs/file.c Tejun Heo
2013-11-28 19:54         ` Tejun Heo [this message]
2013-11-28 19:54         ` [PATCH 23/34] sysfs, kernfs: drop unused params from sysfs_fill_super() Tejun Heo
2013-11-28 19:54         ` [PATCH 24/34] sysfs, kernfs: make sysfs_super_info->ns const Tejun Heo
2013-11-28 19:54         ` [PATCH 25/34] sysfs, kernfs: no need to kern_mount() sysfs from sysfs_init() Tejun Heo
2013-11-28 19:54         ` [PATCH 26/34] sysfs, kernfs: introduce sysfs_root_sd Tejun Heo
2013-11-28 19:54         ` [PATCH 27/34] sysfs, kernfs: implement kernfs_create/destroy_root() Tejun Heo
2013-11-28 19:54         ` [PATCH 28/34] sysfs, kernfs: make inode number ida per kernfs_root Tejun Heo
2013-11-28 19:54         ` [PATCH 29/34] sysfs, kernfs: make super_blocks bind to different kernfs_roots Tejun Heo
2013-11-28 19:54         ` [PATCH 30/34] sysfs, kernfs: prepare mount path for kernfs Tejun Heo
2013-11-28 19:54         ` [PATCH 31/34] sysfs, kernfs: move mount core code to fs/kernfs/mount.c Tejun Heo
2013-11-28 19:54         ` [PATCH 32/34] sysfs, kernfs: make sysfs_dirent definition public Tejun Heo
2013-11-29 22:18           ` Tejun Heo
2013-11-29 22:19             ` Tejun Heo
2013-11-28 19:54         ` [PATCH 33/34] sysfs, kernfs: implement kernfs_ns_enabled() Tejun Heo
2013-11-29 22:19           ` [PATCH v2 " Tejun Heo
2013-11-28 19:54         ` [PATCH 34/34] sysfs, kernfs: remove cross inclusions of internal headers Tejun Heo
2013-11-29 22:21         ` [PATCHSET PARTIAL REPOST driver-core-next] sysfs: separate out kernfs, take #3 Tejun Heo
2013-11-30  2:55           ` Greg KH
2013-11-30 13:05             ` Tejun Heo
2013-11-23 22:21 ` [PATCH 10/41] sysfs, kernfs: prepare read path for kernfs Tejun Heo
2013-11-23 22:21 ` [PATCH 11/41] sysfs, kernfs: prepare write " Tejun Heo
2013-11-23 22:21 ` [PATCH 12/41] sysfs, kernfs: prepare mmap " Tejun Heo
2013-11-23 22:21 ` [PATCH 13/41] sysfs, kernfs: prepare open, release, poll paths " Tejun Heo
2013-11-23 22:21 ` [PATCH 14/41] sysfs, kernfs: move sysfs_open_file to include/linux/kernfs.h Tejun Heo
2013-11-23 22:22 ` [PATCH 15/41] sysfs, kernfs: introduce kernfs_ops Tejun Heo
2013-11-23 22:22 ` [PATCH 16/41] sysfs, kernfs: add sysfs_dirent->s_attr.size Tejun Heo
2013-11-23 22:22 ` [PATCH 17/41] sysfs, kernfs: remove SYSFS_KOBJ_BIN_ATTR Tejun Heo
2013-11-23 22:22 ` [PATCH 18/41] sysfs, kernfs: introduce kernfs_create_file[_ns]() Tejun Heo
2013-11-23 22:22 ` [PATCH 19/41] sysfs, kernfs: remove sysfs_add_one() Tejun Heo
2013-11-23 22:22 ` [PATCH 20/41] sysfs, kernfs: add kernfs_ops->seq_{start|next|stop}() Tejun Heo
2013-11-23 22:22 ` [PATCH 21/41] sysfs, kernfs: introduce kernfs_notify() Tejun Heo
2013-11-23 22:22 ` [PATCH 22/41] sysfs, kernfs: reorganize SYSFS_* constants Tejun Heo
2013-11-23 22:22 ` [PATCH 23/41] sysfs, kernfs: revamp sysfs_dirent active_ref lockdep annotation Tejun Heo
2013-11-23 22:22 ` [PATCH 24/41] sysfs, kernfs: introduce kernfs[_find_and]_get() and kernfs_put() Tejun Heo
2013-11-23 22:22 ` [PATCH 25/41] sysfs, kernfs: move internal decls to fs/kernfs/kernfs-internal.h Tejun Heo
2013-11-23 22:22 ` [PATCH 26/41] sysfs, kernfs: move inode code to fs/kernfs/inode.c Tejun Heo
2013-11-23 22:22 ` [PATCH 27/41] sysfs, kernfs: move dir core code to fs/kernfs/dir.c Tejun Heo
2013-11-23 22:22 ` [PATCH 28/41] sysfs, kernfs: move file core code to fs/kernfs/file.c Tejun Heo
2013-11-23 22:22 ` [PATCH 29/41] sysfs, kernfs: move symlink core code to fs/kernfs/symlink.c Tejun Heo
2013-11-23 22:22 ` [PATCH 30/41] sysfs, kernfs: drop unused params from sysfs_fill_super() Tejun Heo
2013-11-23 22:22 ` [PATCH 31/41] sysfs, kernfs: make sysfs_super_info->ns const Tejun Heo
2013-11-23 22:22 ` [PATCH 32/41] sysfs, kernfs: no need to kern_mount() sysfs from sysfs_init() Tejun Heo
2013-11-23 22:22 ` [PATCH 33/41] sysfs, kernfs: introduce sysfs_root_sd Tejun Heo
2013-11-23 22:22 ` [PATCH 34/41] sysfs, kernfs: implement kernfs_create/destroy_root() Tejun Heo
2013-11-23 22:22 ` [PATCH 35/41] sysfs, kernfs: make inode number ida per kernfs_root Tejun Heo
2013-11-23 22:22 ` [PATCH 36/41] sysfs, kernfs: make super_blocks bind to different kernfs_roots Tejun Heo
2013-11-23 22:22 ` [PATCH 37/41] sysfs, kernfs: prepare mount path for kernfs Tejun Heo
2013-11-24 14:57   ` [PATCH REPOST " Tejun Heo
2013-11-23 22:22 ` [PATCH 38/41] sysfs, kernfs: move mount core code to fs/kernfs/mount.c Tejun Heo
2013-11-23 22:22 ` [PATCH 39/41] sysfs, kernfs: make sysfs_dirent definition public Tejun Heo
2013-11-23 22:22 ` [PATCH 40/41] sysfs, kernfs: implement kernfs_ns_enabled() Tejun Heo
2013-11-23 22:22 ` [PATCH 41/41] sysfs, kernfs: remove cross inclusions of internal headers Tejun Heo
2013-11-23 22:48 ` [PATCHSET driver-core-next] sysfs: separate out kernfs, take #3 Tejun Heo
2013-11-23 23:09   ` Tejun Heo
2013-11-24  9:16 ` Christoph Hellwig
2013-11-24 14:28   ` Tejun Heo

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=1385668487-10181-23-git-send-email-tj@kernel.org \
    --to=tj@kernel.org \
    --cc=bhelgaas@google.com \
    --cc=ebiederm@xmission.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=kay@vrfy.org \
    --cc=linux-kernel@vger.kernel.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).