diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2006-06-20 11:19:40 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-06-20 11:19:40 -0400 |
commit | d636b2798732f2cfba48d94aa19b7ba206268a83 (patch) | |
tree | 40dc52126ab5a1570a000321d93ca4bb03312684 /net/llc/llc_input.c | |
parent | 9f5aa2a921797ce6eb4542c7517915bd1d5fbd0b (diff) | |
parent | 25f42b6af09e34c3f92107b36b5aa6edc2fdba2f (diff) | |
download | talos-op-linux-d636b2798732f2cfba48d94aa19b7ba206268a83.tar.gz talos-op-linux-d636b2798732f2cfba48d94aa19b7ba206268a83.zip |
Merge branch 'master'
Diffstat (limited to 'net/llc/llc_input.c')
-rw-r--r-- | net/llc/llc_input.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/net/llc/llc_input.c b/net/llc/llc_input.c index d62e0f9b9da3..94d2368ade92 100644 --- a/net/llc/llc_input.c +++ b/net/llc/llc_input.c @@ -142,6 +142,8 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev, struct llc_sap *sap; struct llc_pdu_sn *pdu; int dest; + int (*rcv)(struct sk_buff *, struct net_device *, + struct packet_type *, struct net_device *); /* * When the interface is in promisc. mode, drop all the crap that it @@ -169,9 +171,11 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev, * First the upper layer protocols that don't need the full * LLC functionality */ - if (sap->rcv_func) { - sap->rcv_func(skb, dev, pt, orig_dev); - goto out_put; + rcv = rcu_dereference(sap->rcv_func); + if (rcv) { + struct sk_buff *cskb = skb_clone(skb, GFP_ATOMIC); + if (cskb) + rcv(cskb, dev, pt, orig_dev); } dest = llc_pdu_type(skb); if (unlikely(!dest || !llc_type_handlers[dest - 1])) |