+++ /dev/null
-From ebiederm@xmission.com Tue Mar 12 14:52:56 2013
-From: ebiederm@xmission.com (Eric W. Biederman)
-Date: Mon, 11 Mar 2013 17:41:28 -0700
-Subject: decnet: Fix disappearing sysctl entries
-To: stable@vger.kernel.org
-Cc: Larry Baker <baker@usgs.gov>
-Message-ID: <8738w1ih53.fsf@xmission.com>
-
-
-When decnet is built as a module a simple:
-echo 0.0 >/proc/sys/net/decnet/node_address
-
-results in most of the sysctl entries under /proc/sys/net/decnet and
-/proc/sys/net/decnet/conf disappearing.
-
-For more details see http://www.spinics.net/lists/netdev/msg226123.html.
-
-This change applies the same workaround used in
-net/core/sysctl_net_core.c and net/ipv6/sysctl_net_ipv6.c of creating
-a skeleton of decnet sysctl entries before doing anything else.
-
-The problem first appeared in kernel 2.6.27. The later rewrite of
-sysctl in kernel 3.4 restored the previous behavior and eliminated the
-need for this workaround.
-
-This patch was heavily inspired by a similar but more complex patch by
-Larry Baker.
-
-Reported-by: Larry Baker <baker@usgs.gov>
-Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
-Acked-by: David Miller <davem@redhat.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- net/decnet/af_decnet.c | 4 ++++
- net/decnet/sysctl_net_decnet.c | 28 ++++++++++++++++++++++++++++
- 2 files changed, 32 insertions(+)
-
---- a/net/decnet/af_decnet.c
-+++ b/net/decnet/af_decnet.c
-@@ -2353,6 +2353,8 @@ static const struct proto_ops dn_proto_o
- .sendpage = sock_no_sendpage,
- };
-
-+void dn_register_sysctl_skeleton(void);
-+void dn_unregister_sysctl_skeleton(void);
- void dn_register_sysctl(void);
- void dn_unregister_sysctl(void);
-
-@@ -2373,6 +2375,7 @@ static int __init decnet_init(void)
- if (rc != 0)
- goto out;
-
-+ dn_register_sysctl_skeleton();
- dn_neigh_init();
- dn_dev_init();
- dn_route_init();
-@@ -2412,6 +2415,7 @@ static void __exit decnet_exit(void)
- dn_fib_cleanup();
-
- proc_net_remove(&init_net, "decnet");
-+ dn_unregister_sysctl_skeleton();
-
- proto_unregister(&dn_proto);
-
---- a/net/decnet/sysctl_net_decnet.c
-+++ b/net/decnet/sysctl_net_decnet.c
-@@ -55,6 +55,7 @@ static int max_decnet_no_fc_max_cwnd[] =
- static char node_name[7] = "???";
-
- static struct ctl_table_header *dn_table_header = NULL;
-+static struct ctl_table_header *dn_skeleton_table_header = NULL;
-
- /*
- * ctype.h :-)
-@@ -357,6 +358,27 @@ static struct ctl_path dn_path[] = {
- { }
- };
-
-+static struct ctl_table empty[1];
-+
-+static struct ctl_table dn_skeleton[] = {
-+ {
-+ .procname = "conf",
-+ .mode = 0555,
-+ .child = empty,
-+ },
-+ { }
-+};
-+
-+void dn_register_sysctl_skeleton(void)
-+{
-+ dn_skeleton_table_header = register_sysctl_paths(dn_path, dn_skeleton);
-+}
-+
-+void dn_unregister_sysctl_skeleton(void)
-+{
-+ unregister_sysctl_table(dn_skeleton_table_header);
-+}
-+
- void dn_register_sysctl(void)
- {
- dn_table_header = register_sysctl_paths(dn_path, dn_table);
-@@ -368,6 +390,12 @@ void dn_unregister_sysctl(void)
- }
-
- #else /* CONFIG_SYSCTL */
-+void dn_register_sysctl_skeleton(void)
-+{
-+}
-+void dn_unregister_sysctl_skeleton(void)
-+{
-+}
- void dn_unregister_sysctl(void)
- {
- }