| From foo@baz Mon Sep 17 13:33:56 CEST 2018 |
| From: Stephen Hemminger <stephen@networkplumber.org> |
| Date: Thu, 13 Sep 2018 07:58:33 -0700 |
| Subject: inet: frags: change inet_frags_init_net() return value |
| To: davem@davemloft.net, gregkh@linuxfoundation.org |
| Cc: netdev@vger.kernel.org, stable@vger.kernel.org, edumazet@google.com |
| Message-ID: <20180913145902.17531-2-sthemmin@microsoft.com> |
| |
| From: Eric Dumazet <edumazet@google.com> |
| |
| We will soon initialize one rhashtable per struct netns_frags |
| in inet_frags_init_net(). |
| |
| This patch changes the return value to eventually propagate an |
| error. |
| |
| Signed-off-by: Eric Dumazet <edumazet@google.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| (cherry picked from commit 787bea7748a76130566f881c2342a0be4127d182) |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| include/net/inet_frag.h | 3 ++- |
| net/ieee802154/6lowpan/reassembly.c | 11 ++++++++--- |
| net/ipv4/ip_fragment.c | 12 +++++++++--- |
| net/ipv6/netfilter/nf_conntrack_reasm.c | 12 +++++++++--- |
| net/ipv6/reassembly.c | 11 +++++++++-- |
| 5 files changed, 37 insertions(+), 12 deletions(-) |
| |
| --- a/include/net/inet_frag.h |
| +++ b/include/net/inet_frag.h |
| @@ -104,9 +104,10 @@ struct inet_frags { |
| int inet_frags_init(struct inet_frags *); |
| void inet_frags_fini(struct inet_frags *); |
| |
| -static inline void inet_frags_init_net(struct netns_frags *nf) |
| +static inline int inet_frags_init_net(struct netns_frags *nf) |
| { |
| atomic_set(&nf->mem, 0); |
| + return 0; |
| } |
| void inet_frags_exit_net(struct netns_frags *nf, struct inet_frags *f); |
| |
| --- a/net/ieee802154/6lowpan/reassembly.c |
| +++ b/net/ieee802154/6lowpan/reassembly.c |
| @@ -580,14 +580,19 @@ static int __net_init lowpan_frags_init_ |
| { |
| struct netns_ieee802154_lowpan *ieee802154_lowpan = |
| net_ieee802154_lowpan(net); |
| + int res; |
| |
| ieee802154_lowpan->frags.high_thresh = IPV6_FRAG_HIGH_THRESH; |
| ieee802154_lowpan->frags.low_thresh = IPV6_FRAG_LOW_THRESH; |
| ieee802154_lowpan->frags.timeout = IPV6_FRAG_TIMEOUT; |
| |
| - inet_frags_init_net(&ieee802154_lowpan->frags); |
| - |
| - return lowpan_frags_ns_sysctl_register(net); |
| + res = inet_frags_init_net(&ieee802154_lowpan->frags); |
| + if (res < 0) |
| + return res; |
| + res = lowpan_frags_ns_sysctl_register(net); |
| + if (res < 0) |
| + inet_frags_exit_net(&ieee802154_lowpan->frags, &lowpan_frags); |
| + return res; |
| } |
| |
| static void __net_exit lowpan_frags_exit_net(struct net *net) |
| --- a/net/ipv4/ip_fragment.c |
| +++ b/net/ipv4/ip_fragment.c |
| @@ -850,6 +850,8 @@ static void __init ip4_frags_ctl_registe |
| |
| static int __net_init ipv4_frags_init_net(struct net *net) |
| { |
| + int res; |
| + |
| /* Fragment cache limits. |
| * |
| * The fragment memory accounting code, (tries to) account for |
| @@ -875,9 +877,13 @@ static int __net_init ipv4_frags_init_ne |
| |
| net->ipv4.frags.max_dist = 64; |
| |
| - inet_frags_init_net(&net->ipv4.frags); |
| - |
| - return ip4_frags_ns_ctl_register(net); |
| + res = inet_frags_init_net(&net->ipv4.frags); |
| + if (res < 0) |
| + return res; |
| + res = ip4_frags_ns_ctl_register(net); |
| + if (res < 0) |
| + inet_frags_exit_net(&net->ipv4.frags, &ip4_frags); |
| + return res; |
| } |
| |
| static void __net_exit ipv4_frags_exit_net(struct net *net) |
| --- a/net/ipv6/netfilter/nf_conntrack_reasm.c |
| +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c |
| @@ -630,12 +630,18 @@ EXPORT_SYMBOL_GPL(nf_ct_frag6_gather); |
| |
| static int nf_ct_net_init(struct net *net) |
| { |
| + int res; |
| + |
| net->nf_frag.frags.high_thresh = IPV6_FRAG_HIGH_THRESH; |
| net->nf_frag.frags.low_thresh = IPV6_FRAG_LOW_THRESH; |
| net->nf_frag.frags.timeout = IPV6_FRAG_TIMEOUT; |
| - inet_frags_init_net(&net->nf_frag.frags); |
| - |
| - return nf_ct_frag6_sysctl_register(net); |
| + res = inet_frags_init_net(&net->nf_frag.frags); |
| + if (res < 0) |
| + return res; |
| + res = nf_ct_frag6_sysctl_register(net); |
| + if (res < 0) |
| + inet_frags_exit_net(&net->nf_frag.frags, &nf_frags); |
| + return res; |
| } |
| |
| static void nf_ct_net_exit(struct net *net) |
| --- a/net/ipv6/reassembly.c |
| +++ b/net/ipv6/reassembly.c |
| @@ -714,13 +714,20 @@ static void ip6_frags_sysctl_unregister( |
| |
| static int __net_init ipv6_frags_init_net(struct net *net) |
| { |
| + int res; |
| + |
| net->ipv6.frags.high_thresh = IPV6_FRAG_HIGH_THRESH; |
| net->ipv6.frags.low_thresh = IPV6_FRAG_LOW_THRESH; |
| net->ipv6.frags.timeout = IPV6_FRAG_TIMEOUT; |
| |
| - inet_frags_init_net(&net->ipv6.frags); |
| + res = inet_frags_init_net(&net->ipv6.frags); |
| + if (res < 0) |
| + return res; |
| |
| - return ip6_frags_ns_sysctl_register(net); |
| + res = ip6_frags_ns_sysctl_register(net); |
| + if (res < 0) |
| + inet_frags_exit_net(&net->ipv6.frags, &ip6_frags); |
| + return res; |
| } |
| |
| static void __net_exit ipv6_frags_exit_net(struct net *net) |