diff options
Diffstat (limited to 'net/ipv6/ip6_output.c')
-rw-r--r-- | net/ipv6/ip6_output.c | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 653fc0a8235b..86e1835ce4e4 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -1339,6 +1339,19 @@ error: | |||
1339 | return err; | 1339 | return err; |
1340 | } | 1340 | } |
1341 | 1341 | ||
1342 | static void ip6_cork_release(struct inet_sock *inet, struct ipv6_pinfo *np) | ||
1343 | { | ||
1344 | inet->cork.flags &= ~IPCORK_OPT; | ||
1345 | kfree(np->cork.opt); | ||
1346 | np->cork.opt = NULL; | ||
1347 | if (np->cork.rt) { | ||
1348 | dst_release(&np->cork.rt->u.dst); | ||
1349 | np->cork.rt = NULL; | ||
1350 | inet->cork.flags &= ~IPCORK_ALLFRAG; | ||
1351 | } | ||
1352 | memset(&inet->cork.fl, 0, sizeof(inet->cork.fl)); | ||
1353 | } | ||
1354 | |||
1342 | int ip6_push_pending_frames(struct sock *sk) | 1355 | int ip6_push_pending_frames(struct sock *sk) |
1343 | { | 1356 | { |
1344 | struct sk_buff *skb, *tmp_skb; | 1357 | struct sk_buff *skb, *tmp_skb; |
@@ -1415,15 +1428,7 @@ int ip6_push_pending_frames(struct sock *sk) | |||
1415 | } | 1428 | } |
1416 | 1429 | ||
1417 | out: | 1430 | out: |
1418 | inet->cork.flags &= ~IPCORK_OPT; | 1431 | ip6_cork_release(inet, np); |
1419 | kfree(np->cork.opt); | ||
1420 | np->cork.opt = NULL; | ||
1421 | if (np->cork.rt) { | ||
1422 | dst_release(&np->cork.rt->u.dst); | ||
1423 | np->cork.rt = NULL; | ||
1424 | inet->cork.flags &= ~IPCORK_ALLFRAG; | ||
1425 | } | ||
1426 | memset(&inet->cork.fl, 0, sizeof(inet->cork.fl)); | ||
1427 | return err; | 1432 | return err; |
1428 | error: | 1433 | error: |
1429 | goto out; | 1434 | goto out; |
@@ -1431,8 +1436,6 @@ error: | |||
1431 | 1436 | ||
1432 | void ip6_flush_pending_frames(struct sock *sk) | 1437 | void ip6_flush_pending_frames(struct sock *sk) |
1433 | { | 1438 | { |
1434 | struct inet_sock *inet = inet_sk(sk); | ||
1435 | struct ipv6_pinfo *np = inet6_sk(sk); | ||
1436 | struct sk_buff *skb; | 1439 | struct sk_buff *skb; |
1437 | 1440 | ||
1438 | while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) { | 1441 | while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) { |
@@ -1442,14 +1445,5 @@ void ip6_flush_pending_frames(struct sock *sk) | |||
1442 | kfree_skb(skb); | 1445 | kfree_skb(skb); |
1443 | } | 1446 | } |
1444 | 1447 | ||
1445 | inet->cork.flags &= ~IPCORK_OPT; | 1448 | ip6_cork_release(inet_sk(sk), inet6_sk(sk)); |
1446 | |||
1447 | kfree(np->cork.opt); | ||
1448 | np->cork.opt = NULL; | ||
1449 | if (np->cork.rt) { | ||
1450 | dst_release(&np->cork.rt->u.dst); | ||
1451 | np->cork.rt = NULL; | ||
1452 | inet->cork.flags &= ~IPCORK_ALLFRAG; | ||
1453 | } | ||
1454 | memset(&inet->cork.fl, 0, sizeof(inet->cork.fl)); | ||
1455 | } | 1449 | } |