summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/atm/clip.c8
-rw-r--r--net/decnet/dn_dev.c2
-rw-r--r--net/decnet/dn_neigh.c11
-rw-r--r--net/ipv4/arp.c8
-rw-r--r--net/ipv6/ndisc.c6
5 files changed, 17 insertions, 18 deletions
diff --git a/net/atm/clip.c b/net/atm/clip.c
index f7756e1f93ce..104dd4d19da4 100644
--- a/net/atm/clip.c
+++ b/net/atm/clip.c
@@ -320,17 +320,15 @@ static int clip_constructor(struct neighbour *neigh)
if (neigh->type != RTN_UNICAST) return -EINVAL;
rcu_read_lock();
- in_dev = __in_dev_get(dev);
+ in_dev = rcu_dereference(__in_dev_get(dev));
if (!in_dev) {
rcu_read_unlock();
return -EINVAL;
}
parms = in_dev->arp_parms;
- if (parms) {
- __neigh_parms_put(neigh->parms);
- neigh->parms = neigh_parms_clone(parms);
- }
+ __neigh_parms_put(neigh->parms);
+ neigh->parms = neigh_parms_clone(parms);
rcu_read_unlock();
neigh->ops = &clip_neigh_ops;
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c
index 733b1cf6c440..a21a326808b4 100644
--- a/net/decnet/dn_dev.c
+++ b/net/decnet/dn_dev.c
@@ -41,6 +41,7 @@
#include <linux/sysctl.h>
#include <linux/notifier.h>
#include <asm/uaccess.h>
+#include <asm/system.h>
#include <net/neighbour.h>
#include <net/dst.h>
#include <net/flow.h>
@@ -1108,6 +1109,7 @@ struct dn_dev *dn_dev_create(struct net_device *dev, int *err)
memset(dn_db, 0, sizeof(struct dn_dev));
memcpy(&dn_db->parms, p, sizeof(struct dn_dev_parms));
+ smp_wmb();
dev->dn_ptr = dn_db;
dn_db->dev = dev;
init_timer(&dn_db->timer);
diff --git a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c
index e874232ec54b..d3d6c592a5cb 100644
--- a/net/decnet/dn_neigh.c
+++ b/net/decnet/dn_neigh.c
@@ -139,17 +139,20 @@ static int dn_neigh_construct(struct neighbour *neigh)
struct neigh_parms *parms;
rcu_read_lock();
- dn_db = dev->dn_ptr;
+ dn_db = rcu_dereference(dev->dn_ptr);
if (dn_db == NULL) {
rcu_read_unlock();
return -EINVAL;
}
parms = dn_db->neigh_parms;
- if (parms) {
- __neigh_parms_put(neigh->parms);
- neigh->parms = neigh_parms_clone(parms);
+ if (!parms) {
+ rcu_read_unlock();
+ return -EINVAL;
}
+
+ __neigh_parms_put(neigh->parms);
+ neigh->parms = neigh_parms_clone(parms);
rcu_read_unlock();
if (dn_db->use_long)
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c
index f4e6a4a368ec..41e726ac3337 100644
--- a/net/ipv4/arp.c
+++ b/net/ipv4/arp.c
@@ -244,17 +244,15 @@ static int arp_constructor(struct neighbour *neigh)
neigh->type = inet_addr_type(addr);
rcu_read_lock();
- in_dev = __in_dev_get(dev);
+ in_dev = rcu_dereference(__in_dev_get(dev));
if (in_dev == NULL) {
rcu_read_unlock();
return -EINVAL;
}
parms = in_dev->arp_parms;
- if (parms) {
- __neigh_parms_put(neigh->parms);
- neigh->parms = neigh_parms_clone(parms);
- }
+ __neigh_parms_put(neigh->parms);
+ neigh->parms = neigh_parms_clone(parms);
rcu_read_unlock();
if (dev->hard_header == NULL) {
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index 6d23ea909aca..e1f5aeb79258 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -297,10 +297,8 @@ static int ndisc_constructor(struct neighbour *neigh)
}
parms = in6_dev->nd_parms;
- if (parms) {
- __neigh_parms_put(neigh->parms);
- neigh->parms = neigh_parms_clone(parms);
- }
+ __neigh_parms_put(neigh->parms);
+ neigh->parms = neigh_parms_clone(parms);
rcu_read_unlock();
neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST;