===== drivers/s390/net/qeth_main.c 1.14 vs edited ===== --- 1.14/drivers/s390/net/qeth_main.c 2004-09-04 08:22:06 +10:00 +++ edited/drivers/s390/net/qeth_main.c 2004-09-04 09:17:17 +10:00 @@ -6718,17 +6718,15 @@ } 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(); neigh->type = inet_addr_type(*(u32 *) neigh->primary_key); ===== net/atm/clip.c 1.37 vs edited ===== --- 1.37/net/atm/clip.c 2004-09-04 08:22:07 +10:00 +++ edited/net/atm/clip.c 2004-09-04 09:18:22 +10:00 @@ -320,17 +320,15 @@ 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; ===== net/decnet/dn_dev.c 1.25 vs edited ===== --- 1.25/net/decnet/dn_dev.c 2004-09-04 08:22:07 +10:00 +++ edited/net/decnet/dn_dev.c 2004-09-04 09:36:51 +10:00 @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -1108,6 +1109,7 @@ 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); ===== net/decnet/dn_neigh.c 1.11 vs edited ===== --- 1.11/net/decnet/dn_neigh.c 2004-09-04 08:22:07 +10:00 +++ edited/net/decnet/dn_neigh.c 2004-09-04 09:33:12 +10:00 @@ -139,17 +139,20 @@ 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) ===== net/ipv4/arp.c 1.45 vs edited ===== --- 1.45/net/ipv4/arp.c 2004-09-04 08:22:07 +10:00 +++ edited/net/ipv4/arp.c 2004-09-04 09:17:46 +10:00 @@ -244,17 +244,15 @@ 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) { ===== net/ipv6/ndisc.c 1.88 vs edited ===== --- 1.88/net/ipv6/ndisc.c 2004-09-04 08:22:07 +10:00 +++ edited/net/ipv6/ndisc.c 2004-09-04 09:28:12 +10:00 @@ -297,10 +297,8 @@ } 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;