On Sat, Jun 09, 2012 at 10:18:01PM -0400, David Miller wrote: > From: David Miller <davem@xxxxxxxxxxxxx> > Date: Sat, 09 Jun 2012 19:09:29 -0700 (PDT) > > > From: Fengguang Wu <wfg@xxxxxxxxxxxxxxx> > > 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@xxxxxxxxxxxxx> > --- > 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 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/containers