|
@@ -36,7 +36,7 @@
|
|
|
|
|
|
struct phonet_routes {
|
|
|
struct mutex lock;
|
|
|
- struct net_device *table[64];
|
|
|
+ struct net_device __rcu *table[64];
|
|
|
};
|
|
|
|
|
|
struct phonet_net {
|
|
@@ -275,7 +275,7 @@ static void phonet_route_autodel(struct net_device *dev)
|
|
|
bitmap_zero(deleted, 64);
|
|
|
mutex_lock(&pnn->routes.lock);
|
|
|
for (i = 0; i < 64; i++)
|
|
|
- if (dev == pnn->routes.table[i]) {
|
|
|
+ if (rcu_access_pointer(pnn->routes.table[i]) == dev) {
|
|
|
RCU_INIT_POINTER(pnn->routes.table[i], NULL);
|
|
|
set_bit(i, deleted);
|
|
|
}
|
|
@@ -388,7 +388,7 @@ int phonet_route_del(struct net_device *dev, u8 daddr)
|
|
|
|
|
|
daddr = daddr >> 2;
|
|
|
mutex_lock(&routes->lock);
|
|
|
- if (dev == routes->table[daddr])
|
|
|
+ if (rcu_access_pointer(routes->table[daddr]) == dev)
|
|
|
RCU_INIT_POINTER(routes->table[daddr], NULL);
|
|
|
else
|
|
|
dev = NULL;
|