[NETLINK]: Move broadcast skb_orphan to the skb_get path.
Cloned packets don't need the orphan call. Signed-off-by: Tommy S. Christensen <tommy.christensen@tpack.net> Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
db61ecc335
commit
68acc024ea
1 changed files with 7 additions and 4 deletions
|
@ -697,7 +697,6 @@ static __inline__ int netlink_broadcast_deliver(struct sock *sk, struct sk_buff
|
|||
|
||||
if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf &&
|
||||
!test_bit(0, &nlk->state)) {
|
||||
skb_orphan(skb);
|
||||
skb_set_owner_r(skb, sk);
|
||||
skb_queue_tail(&sk->sk_receive_queue, skb);
|
||||
sk->sk_data_ready(sk, skb->len);
|
||||
|
@ -736,11 +735,15 @@ static inline int do_one_broadcast(struct sock *sk,
|
|||
|
||||
sock_hold(sk);
|
||||
if (p->skb2 == NULL) {
|
||||
if (atomic_read(&p->skb->users) != 1) {
|
||||
if (skb_shared(p->skb)) {
|
||||
p->skb2 = skb_clone(p->skb, p->allocation);
|
||||
} else {
|
||||
p->skb2 = p->skb;
|
||||
atomic_inc(&p->skb->users);
|
||||
p->skb2 = skb_get(p->skb);
|
||||
/*
|
||||
* skb ownership may have been set when
|
||||
* delivered to a previous socket.
|
||||
*/
|
||||
skb_orphan(p->skb2);
|
||||
}
|
||||
}
|
||||
if (p->skb2 == NULL) {
|
||||
|
|
Loading…
Reference in a new issue