[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20120610101640.GA14476@localhost>
Date: Sun, 10 Jun 2012 18:16:40 +0800
From: Fengguang Wu <wfg@...ux.intel.com>
To: David Miller <davem@...emloft.net>
Cc: netdev@...r.kernel.org, gaofeng@...fujitsu.com,
containers@...ts.linux-foundation.org
Subject: Re: [PATCH] inet: Initialize per-netns inetpeer roots in
net/ipv{4,6}/route.c
On Sat, Jun 09, 2012 at 10:18:01PM -0400, David Miller wrote:
> From: David Miller <davem@...emloft.net>
> Date: Sat, 09 Jun 2012 19:09:29 -0700 (PDT)
>
> > From: Fengguang Wu <wfg@...ux.intel.com>
> > Date: Sun, 10 Jun 2012 10:08:01 +0800
> >
> >> And in another config, an old error still triggers:
> >>
> >> net/ipv4/inetpeer.c: In function ‘family_to_base’:
> >> net/ipv4/inetpeer.c:397:50: error: ‘struct net’ has no member named ‘ipv6’
> >> net/ipv4/inetpeer.c:398:1: warning: control reaches end of non-void function [-Wreturn-type]
> >>
> >> I'm building this patch on top of net-next master.
> >
> > What a fucking mess Gao created, I'll fix this.
> >
> > Thanks for the report.
>
> I just pushed the following to net-next:
>
> --------------------
> inet: Pass inetpeer root into inet_getpeer*() interfaces.
>
> Otherwise we reference potentially non-existing members when
> ipv6 is disabled.
>
> Signed-off-by: David S. Miller <davem@...emloft.net>
> ---
> include/net/inetpeer.h | 10 +++++-----
> net/ipv4/inetpeer.c | 9 +--------
> net/ipv4/ip_fragment.c | 2 +-
> net/ipv4/route.c | 6 +++---
> net/ipv6/route.c | 2 +-
> 5 files changed, 11 insertions(+), 18 deletions(-)
It triggers some other errors:
net/ipv4/inetpeer.c: In function ‘inetpeer_invalidate_tree’:
net/ipv4/inetpeer.c:585:9: error: implicit declaration of function ‘family_to_base’ [-Werror=implicit-function-declaration]
net/ipv4/inetpeer.c:585:32: warning: initialization makes pointer from integer without a cast [enabled by default]
net/ipv6/tcp_ipv6.c:1758:2: warning: passing argument 1 of ‘inet_getpeer_v6’ from incompatible pointer type [enabled by default]
include/net/inetpeer.h:101:33: note: expected ‘struct inet_peer_base *’ but argument is of type ‘struct net *’
net/ipv4/tcp_ipv4.c:1843:2: warning: passing argument 1 of ‘inet_getpeer_v4’ from incompatible pointer type [enabled by default]
include/net/inetpeer.h:90:33: note: expected ‘struct inet_peer_base *’ but argument is of type ‘struct net *’
which can be fixed by the following diff.
Thanks,
Fengguang
---
net/ipv4/inetpeer.c | 6 ++++++
net/ipv4/tcp_ipv4.c | 2 +-
net/ipv6/tcp_ipv6.c | 2 +-
3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c
index 98cf1f8..7ad6b76 100644
--- a/net/ipv4/inetpeer.c
+++ b/net/ipv4/inetpeer.c
@@ -391,6 +391,12 @@ static void unlink_from_pool(struct inet_peer *p, struct inet_peer_base *base,
call_rcu(&p->rcu, inetpeer_free_rcu);
}
+static struct inet_peer_base *family_to_base(struct net *net,
+ int family)
+{
+ return family == AF_INET ? net->ipv4.peers : net->ipv6.peers;
+}
+
/* perform garbage collect on all items stacked during a lookup */
static int inet_peer_gc(struct inet_peer_base *base,
struct inet_peer __rcu **stack[PEER_MAXDEPTH],
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 77f049d..cf7fe92 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1840,7 +1840,7 @@ void *tcp_v4_tw_get_peer(struct sock *sk)
const struct inet_timewait_sock *tw = inet_twsk(sk);
struct net *net = sock_net(sk);
- return inet_getpeer_v4(net, tw->tw_daddr, 1);
+ return inet_getpeer_v4(net->ipv4.peers, tw->tw_daddr, 1);
}
EXPORT_SYMBOL(tcp_v4_tw_get_peer);
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index b5ecf37..927c029 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -1755,7 +1755,7 @@ static void *tcp_v6_tw_get_peer(struct sock *sk)
if (tw->tw_family == AF_INET)
return tcp_v4_tw_get_peer(sk);
- return inet_getpeer_v6(net, &tw6->tw_v6_daddr, 1);
+ return inet_getpeer_v6(net->ipv6.peers, &tw6->tw_v6_daddr, 1);
}
static struct timewait_sock_ops tcp6_timewait_sock_ops = {
--
1.7.10
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists