diff options
Diffstat (limited to 'include/net/dn_dev.h')
| -rw-r--r-- | include/net/dn_dev.h | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/include/net/dn_dev.h b/include/net/dn_dev.h index 0916bbf3bdff..b9e32db03f20 100644 --- a/include/net/dn_dev.h +++ b/include/net/dn_dev.h | |||
| @@ -5,13 +5,14 @@ | |||
| 5 | struct dn_dev; | 5 | struct dn_dev; |
| 6 | 6 | ||
| 7 | struct dn_ifaddr { | 7 | struct dn_ifaddr { |
| 8 | struct dn_ifaddr *ifa_next; | 8 | struct dn_ifaddr __rcu *ifa_next; |
| 9 | struct dn_dev *ifa_dev; | 9 | struct dn_dev *ifa_dev; |
| 10 | __le16 ifa_local; | 10 | __le16 ifa_local; |
| 11 | __le16 ifa_address; | 11 | __le16 ifa_address; |
| 12 | __u8 ifa_flags; | 12 | __u8 ifa_flags; |
| 13 | __u8 ifa_scope; | 13 | __u8 ifa_scope; |
| 14 | char ifa_label[IFNAMSIZ]; | 14 | char ifa_label[IFNAMSIZ]; |
| 15 | struct rcu_head rcu; | ||
| 15 | }; | 16 | }; |
| 16 | 17 | ||
| 17 | #define DN_DEV_S_RU 0 /* Run - working normally */ | 18 | #define DN_DEV_S_RU 0 /* Run - working normally */ |
| @@ -83,7 +84,7 @@ struct dn_dev_parms { | |||
| 83 | 84 | ||
| 84 | 85 | ||
| 85 | struct dn_dev { | 86 | struct dn_dev { |
| 86 | struct dn_ifaddr *ifa_list; | 87 | struct dn_ifaddr __rcu *ifa_list; |
| 87 | struct net_device *dev; | 88 | struct net_device *dev; |
| 88 | struct dn_dev_parms parms; | 89 | struct dn_dev_parms parms; |
| 89 | char use_long; | 90 | char use_long; |
| @@ -171,19 +172,27 @@ extern int unregister_dnaddr_notifier(struct notifier_block *nb); | |||
| 171 | 172 | ||
| 172 | static inline int dn_dev_islocal(struct net_device *dev, __le16 addr) | 173 | static inline int dn_dev_islocal(struct net_device *dev, __le16 addr) |
| 173 | { | 174 | { |
| 174 | struct dn_dev *dn_db = dev->dn_ptr; | 175 | struct dn_dev *dn_db; |
| 175 | struct dn_ifaddr *ifa; | 176 | struct dn_ifaddr *ifa; |
| 177 | int res = 0; | ||
| 176 | 178 | ||
| 179 | rcu_read_lock(); | ||
| 180 | dn_db = rcu_dereference(dev->dn_ptr); | ||
| 177 | if (dn_db == NULL) { | 181 | if (dn_db == NULL) { |
| 178 | printk(KERN_DEBUG "dn_dev_islocal: Called for non DECnet device\n"); | 182 | printk(KERN_DEBUG "dn_dev_islocal: Called for non DECnet device\n"); |
| 179 | return 0; | 183 | goto out; |
| 180 | } | 184 | } |
| 181 | 185 | ||
| 182 | for(ifa = dn_db->ifa_list; ifa; ifa = ifa->ifa_next) | 186 | for (ifa = rcu_dereference(dn_db->ifa_list); |
| 183 | if ((addr ^ ifa->ifa_local) == 0) | 187 | ifa != NULL; |
| 184 | return 1; | 188 | ifa = rcu_dereference(ifa->ifa_next)) |
| 185 | 189 | if ((addr ^ ifa->ifa_local) == 0) { | |
| 186 | return 0; | 190 | res = 1; |
| 191 | break; | ||
| 192 | } | ||
| 193 | out: | ||
| 194 | rcu_read_unlock(); | ||
| 195 | return res; | ||
| 187 | } | 196 | } |
| 188 | 197 | ||
| 189 | #endif /* _NET_DN_DEV_H */ | 198 | #endif /* _NET_DN_DEV_H */ |
