--- /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
+@@ -2355,6 +2355,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);
+
+@@ -2375,6 +2377,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();
+@@ -2414,6 +2417,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 :-)
+@@ -356,6 +357,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);
+@@ -367,6 +389,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)
+ {
+ }
--- /dev/null
+From a40e7cf8f06b4e322ba902e4e9f6a6b0c2daa907 Mon Sep 17 00:00:00 2001
+From: Ben Hutchings <ben@decadent.org.uk>
+Date: Fri, 8 Mar 2013 12:43:32 -0800
+Subject: dmi_scan: fix missing check for _DMI_ signature in smbios_present()
+
+From: Ben Hutchings <ben@decadent.org.uk>
+
+commit a40e7cf8f06b4e322ba902e4e9f6a6b0c2daa907 upstream.
+
+Commit 9f9c9cbb6057 ("drivers/firmware/dmi_scan.c: fetch dmi version
+from SMBIOS if it exists") hoisted the check for "_DMI_" into
+dmi_scan_machine(), which means that we don't bother to check for
+"_DMI_" at offset 16 in an SMBIOS entry. smbios_present() may also call
+dmi_present() for an address where we found "_SM_", if it failed further
+validation.
+
+Check for "_DMI_" in smbios_present() before calling dmi_present().
+
+[akpm@linux-foundation.org: fix build]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+Reported-by: Tim McGrath <tmhikaru@gmail.com>
+Tested-by: Tim Mcgrath <tmhikaru@gmail.com>
+Cc: Zhenzhong Duan <zhenzhong.duan@oracle.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/firmware/dmi_scan.c | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+--- a/drivers/firmware/dmi_scan.c
++++ b/drivers/firmware/dmi_scan.c
+@@ -442,7 +442,6 @@ static int __init dmi_present(const char
+ static int __init smbios_present(const char __iomem *p)
+ {
+ u8 buf[32];
+- int offset = 0;
+
+ memcpy_fromio(buf, p, 32);
+ if ((buf[5] < 32) && dmi_checksum(buf, buf[5])) {
+@@ -461,9 +460,9 @@ static int __init smbios_present(const c
+ dmi_ver = 0x0206;
+ break;
+ }
+- offset = 16;
++ return memcmp(p + 16, "_DMI_", 5) || dmi_present(p + 16);
+ }
+- return dmi_present(buf + offset);
++ return 1;
+ }
+
+ void __init dmi_scan_machine(void)