diff options
author | David S. Miller <davem@davemloft.net> | 2010-08-16 23:44:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-08-16 23:44:14 -0400 |
commit | eca6fc7836af8eec9ba7e029b604690451bb44a0 (patch) | |
tree | 759656c7a125530a8e2b860aa5bd377df23db6f8 /net | |
parent | da5cabf80e2433131bf0ed8993abc0f7ea618c73 (diff) | |
parent | 5ca6f7c85159a5ca7e637b1d9f79f0d9bc56e5dc (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv6/route.c | 4 | ||||
-rw-r--r-- | net/netlink/af_netlink.c | 22 | ||||
-rw-r--r-- | net/xfrm/xfrm_user.c | 2 |
3 files changed, 9 insertions, 19 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 8f2d0400cf8a..d126365ac046 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -2580,7 +2580,7 @@ ctl_table ipv6_route_table_template[] = { | |||
2580 | .data = &init_net.ipv6.sysctl.ip6_rt_gc_elasticity, | 2580 | .data = &init_net.ipv6.sysctl.ip6_rt_gc_elasticity, |
2581 | .maxlen = sizeof(int), | 2581 | .maxlen = sizeof(int), |
2582 | .mode = 0644, | 2582 | .mode = 0644, |
2583 | .proc_handler = proc_dointvec_jiffies, | 2583 | .proc_handler = proc_dointvec, |
2584 | }, | 2584 | }, |
2585 | { | 2585 | { |
2586 | .procname = "mtu_expires", | 2586 | .procname = "mtu_expires", |
@@ -2594,7 +2594,7 @@ ctl_table ipv6_route_table_template[] = { | |||
2594 | .data = &init_net.ipv6.sysctl.ip6_rt_min_advmss, | 2594 | .data = &init_net.ipv6.sysctl.ip6_rt_min_advmss, |
2595 | .maxlen = sizeof(int), | 2595 | .maxlen = sizeof(int), |
2596 | .mode = 0644, | 2596 | .mode = 0644, |
2597 | .proc_handler = proc_dointvec_jiffies, | 2597 | .proc_handler = proc_dointvec, |
2598 | }, | 2598 | }, |
2599 | { | 2599 | { |
2600 | .procname = "gc_min_interval_ms", | 2600 | .procname = "gc_min_interval_ms", |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 2cbf380377d5..8648a9922aab 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -1406,7 +1406,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock, | |||
1406 | struct netlink_sock *nlk = nlk_sk(sk); | 1406 | struct netlink_sock *nlk = nlk_sk(sk); |
1407 | int noblock = flags&MSG_DONTWAIT; | 1407 | int noblock = flags&MSG_DONTWAIT; |
1408 | size_t copied; | 1408 | size_t copied; |
1409 | struct sk_buff *skb; | 1409 | struct sk_buff *skb, *frag __maybe_unused = NULL; |
1410 | int err; | 1410 | int err; |
1411 | 1411 | ||
1412 | if (flags&MSG_OOB) | 1412 | if (flags&MSG_OOB) |
@@ -1441,21 +1441,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock, | |||
1441 | kfree_skb(skb); | 1441 | kfree_skb(skb); |
1442 | skb = compskb; | 1442 | skb = compskb; |
1443 | } else { | 1443 | } else { |
1444 | /* | 1444 | frag = skb_shinfo(skb)->frag_list; |
1445 | * Before setting frag_list to NULL, we must get a | ||
1446 | * private copy of skb if shared (because of MSG_PEEK) | ||
1447 | */ | ||
1448 | if (skb_shared(skb)) { | ||
1449 | struct sk_buff *nskb; | ||
1450 | |||
1451 | nskb = pskb_copy(skb, GFP_KERNEL); | ||
1452 | kfree_skb(skb); | ||
1453 | skb = nskb; | ||
1454 | err = -ENOMEM; | ||
1455 | if (!skb) | ||
1456 | goto out; | ||
1457 | } | ||
1458 | kfree_skb(skb_shinfo(skb)->frag_list); | ||
1459 | skb_shinfo(skb)->frag_list = NULL; | 1445 | skb_shinfo(skb)->frag_list = NULL; |
1460 | } | 1446 | } |
1461 | } | 1447 | } |
@@ -1492,6 +1478,10 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock, | |||
1492 | if (flags & MSG_TRUNC) | 1478 | if (flags & MSG_TRUNC) |
1493 | copied = skb->len; | 1479 | copied = skb->len; |
1494 | 1480 | ||
1481 | #ifdef CONFIG_COMPAT_NETLINK_MESSAGES | ||
1482 | skb_shinfo(skb)->frag_list = frag; | ||
1483 | #endif | ||
1484 | |||
1495 | skb_free_datagram(sk, skb); | 1485 | skb_free_datagram(sk, skb); |
1496 | 1486 | ||
1497 | if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) | 1487 | if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index ba59983aaffe..b14ed4b1f27c 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -2504,7 +2504,7 @@ static struct xfrm_policy *xfrm_compile_policy(struct sock *sk, int opt, | |||
2504 | if (p->dir > XFRM_POLICY_OUT) | 2504 | if (p->dir > XFRM_POLICY_OUT) |
2505 | return NULL; | 2505 | return NULL; |
2506 | 2506 | ||
2507 | xp = xfrm_policy_alloc(net, GFP_KERNEL); | 2507 | xp = xfrm_policy_alloc(net, GFP_ATOMIC); |
2508 | if (xp == NULL) { | 2508 | if (xp == NULL) { |
2509 | *dir = -ENOBUFS; | 2509 | *dir = -ENOBUFS; |
2510 | return NULL; | 2510 | return NULL; |