-
/*
* DECnet An implementation of the DECnet protocol suite for the LINUX
* operating system. DECnet is implemented using the BSD Socket
static inline void dnrt_free(struct dn_route *rt)
{
- call_rcu(&rt->u.dst.rcu_head, dst_rcu_free);
+ call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free);
}
static inline void dnrt_drop(struct dn_route *rt)
{
if (rt)
dst_release(&rt->u.dst);
- call_rcu(&rt->u.dst.rcu_head, dst_rcu_free);
+ call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free);
}
static void dn_dst_check_expire(unsigned long dummy)
* here
*/
if (!try_hard) {
- neigh = dn_neigh_lookup(&dn_neigh_table, &fl.fld_dst);
+ neigh = neigh_lookup_nodev(&dn_neigh_table, &fl.fld_dst);
if (neigh) {
if ((oldflp->oif &&
(neigh->dev->ifindex != oldflp->oif)) ||
struct dn_route *rt = NULL;
if (!(flags & MSG_TRYHARD)) {
- rcu_read_lock();
- for(rt = dn_rt_hash_table[hash].chain; rt; rt = rt->u.rt_next) {
- read_barrier_depends();
+ rcu_read_lock_bh();
+ for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt;
+ rt = rcu_dereference(rt->u.rt_next)) {
if ((flp->fld_dst == rt->fl.fld_dst) &&
(flp->fld_src == rt->fl.fld_src) &&
#ifdef CONFIG_DECNET_ROUTE_FWMARK
rt->u.dst.lastuse = jiffies;
dst_hold(&rt->u.dst);
rt->u.dst.__use++;
- rcu_read_unlock();
+ rcu_read_unlock_bh();
*pprt = &rt->u.dst;
return 0;
}
}
- rcu_read_unlock();
+ rcu_read_unlock_bh();
}
return dn_route_output_slow(pprt, flp, flags);
return 0;
rcu_read_lock();
- for(rt = dn_rt_hash_table[hash].chain; rt != NULL; rt = rt->u.rt_next) {
- read_barrier_depends();
+ for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt != NULL;
+ rt = rcu_dereference(rt->u.rt_next)) {
if ((rt->fl.fld_src == cb->src) &&
(rt->fl.fld_dst == cb->dst) &&
(rt->fl.oif == 0) &&
continue;
if (h > s_h)
s_idx = 0;
- rcu_read_lock();
- for(rt = dn_rt_hash_table[h].chain, idx = 0; rt; rt = rt->u.rt_next, idx++) {
- read_barrier_depends();
+ rcu_read_lock_bh();
+ for(rt = rcu_dereference(dn_rt_hash_table[h].chain), idx = 0;
+ rt;
+ rt = rcu_dereference(rt->u.rt_next), idx++) {
if (idx < s_idx)
continue;
skb->dst = dst_clone(&rt->u.dst);
if (dn_rt_fill_info(skb, NETLINK_CB(cb->skb).pid,
cb->nlh->nlmsg_seq, RTM_NEWROUTE, 1) <= 0) {
dst_release(xchg(&skb->dst, NULL));
- rcu_read_unlock();
+ rcu_read_unlock_bh();
goto done;
}
dst_release(xchg(&skb->dst, NULL));
}
- rcu_read_unlock();
+ rcu_read_unlock_bh();
}
done:
struct dn_rt_cache_iter_state *s = seq->private;
for(s->bucket = dn_rt_hash_mask; s->bucket >= 0; --s->bucket) {
- rcu_read_lock();
+ rcu_read_lock_bh();
rt = dn_rt_hash_table[s->bucket].chain;
if (rt)
break;
static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_route *rt)
{
- struct dn_rt_cache_iter_state *s = seq->private;
+ struct dn_rt_cache_iter_state *s = rcu_dereference(seq->private);
- smp_read_barrier_depends();
rt = rt->u.rt_next;
while(!rt) {
- rcu_read_unlock();
+ rcu_read_unlock_bh();
if (--s->bucket < 0)
break;
- rcu_read_lock();
+ rcu_read_lock_bh();
rt = dn_rt_hash_table[s->bucket].chain;
}
return rt;
static void dn_rt_cache_seq_stop(struct seq_file *seq, void *v)
{
if (v)
- rcu_read_unlock();
+ rcu_read_unlock_bh();
}
static int dn_rt_cache_seq_show(struct seq_file *seq, void *v)