From 0c34e79110680428e4d3c75b44b25e5bd96c7808 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Wed, 1 Feb 2012 16:34:25 -0500 Subject: [PATCH] --- yaml --- r: 289855 b: refs/heads/master c: 3329bdfc4071840816d6666c6463fdb0bd4c8264 h: refs/heads/master i: 289853: 6ef93e3dbdaac3c8fd465a1f4850ea12d413dd44 289851: b2805abb32f695ea9ff3c13047e93354d3c1a178 289847: bb62f1c28a584d73859f3d89ef44af26dca7813c 289839: e72228226a2e75191e8241071d33e71001cc0352 289823: 375c621b45d7bd6fa412c618d154be63298f0a9c 289791: 4d43e994fe92233a4b03ecb39a4c3f0544f97f83 v: v3 --- [refs] | 2 +- trunk/net/decnet/dn_neigh.c | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/[refs] b/[refs] index d316281c7e45..4a2270dcbbbe 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f79d52c254e4e2cef3da64dc02ade3bc8f10c539 +refs/heads/master: 3329bdfc4071840816d6666c6463fdb0bd4c8264 diff --git a/trunk/net/decnet/dn_neigh.c b/trunk/net/decnet/dn_neigh.c index befe426491ba..ee7013f24fca 100644 --- a/trunk/net/decnet/dn_neigh.c +++ b/trunk/net/decnet/dn_neigh.c @@ -205,17 +205,23 @@ static int dn_neigh_output_packet(struct sk_buff *skb) struct neighbour *neigh = dst_get_neighbour_noref(dst); struct net_device *dev = neigh->dev; char mac_addr[ETH_ALEN]; + unsigned int seq; + int err; dn_dn2eth(mac_addr, rt->rt_local_src); - if (dev_hard_header(skb, dev, ntohs(skb->protocol), neigh->ha, - mac_addr, skb->len) >= 0) - return dev_queue_xmit(skb); - - if (net_ratelimit()) - printk(KERN_DEBUG "dn_neigh_output_packet: oops, can't send packet\n"); - - kfree_skb(skb); - return -EINVAL; + do { + seq = read_seqbegin(&neigh->ha_lock); + err = dev_hard_header(skb, dev, ntohs(skb->protocol), + neigh->ha, mac_addr, skb->len); + } while (read_seqretry(&neigh->ha_lock, seq)); + + if (err >= 0) + err = dev_queue_xmit(skb); + else { + kfree_skb(skb); + err = -EINVAL; + } + return err; } static int dn_long_output(struct neighbour *neigh, struct sk_buff *skb)