diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2013-09-07 12:27:11 +1000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-09-11 16:03:12 -0400 |
commit | de9e8f3f4086b1e6ba302487074fb707f1a95fc7 (patch) | |
tree | 5466e1d77851f0dcca945c7c9dc3645a681d22fd /drivers/net | |
parent | 97f3f6fc23e516012b614c263847120caaab7020 (diff) | |
download | op-kernel-dev-de9e8f3f4086b1e6ba302487074fb707f1a95fc7.zip op-kernel-dev-de9e8f3f4086b1e6ba302487074fb707f1a95fc7.tar.gz |
macvlan: Move skb_clone check closer to call
Currently macvlan calls skb_clone in macvlan_broadcast but checks
for a NULL return in macvlan_broadcast_one instead. This is
needlessly confusing and may lead to bugs introduced later.
This patch moves the error check to where the skb_clone call is.
The only other caller of macvlan_broadcast_one never passes in a
NULL value so it doesn't need the check either.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Thanks,
Reviewed-by: Simon Horman <horms@verge.net.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/macvlan.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 64dfaa3..9bf46bd 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c @@ -118,8 +118,6 @@ static int macvlan_broadcast_one(struct sk_buff *skb, const struct ethhdr *eth, bool local) { struct net_device *dev = vlan->dev; - if (!skb) - return NET_RX_DROP; if (local) return vlan->forward(dev, skb); @@ -171,9 +169,13 @@ static void macvlan_broadcast(struct sk_buff *skb, hash = mc_hash(vlan, eth->h_dest); if (!test_bit(hash, vlan->mc_filter)) continue; + + err = NET_RX_DROP; nskb = skb_clone(skb, GFP_ATOMIC); - err = macvlan_broadcast_one(nskb, vlan, eth, - mode == MACVLAN_MODE_BRIDGE); + if (likely(nskb)) + err = macvlan_broadcast_one( + nskb, vlan, eth, + mode == MACVLAN_MODE_BRIDGE); macvlan_count_rx(vlan, skb->len + ETH_HLEN, err == NET_RX_SUCCESS, 1); } |