diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/net/cipso_ipv4.h | 2 | ||||
| -rw-r--r-- | include/net/dst.h | 17 | ||||
| -rw-r--r-- | include/net/netlabel.h | 2 |
3 files changed, 15 insertions, 6 deletions
diff --git a/include/net/cipso_ipv4.h b/include/net/cipso_ipv4.h index 3b938743514b..9808877c2ab9 100644 --- a/include/net/cipso_ipv4.h +++ b/include/net/cipso_ipv4.h | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | * have chosen to adopt the protocol and over the years it has become a | 8 | * have chosen to adopt the protocol and over the years it has become a |
| 9 | * de-facto standard for labeled networking. | 9 | * de-facto standard for labeled networking. |
| 10 | * | 10 | * |
| 11 | * Author: Paul Moore <paul.moore@hp.com> | 11 | * Author: Paul Moore <paul@paul-moore.com> |
| 12 | * | 12 | * |
| 13 | */ | 13 | */ |
| 14 | 14 | ||
diff --git a/include/net/dst.h b/include/net/dst.h index 29e255796ce1..13d507d69ddb 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
| @@ -37,7 +37,7 @@ struct dst_entry { | |||
| 37 | unsigned long _metrics; | 37 | unsigned long _metrics; |
| 38 | unsigned long expires; | 38 | unsigned long expires; |
| 39 | struct dst_entry *path; | 39 | struct dst_entry *path; |
| 40 | struct neighbour *_neighbour; | 40 | struct neighbour __rcu *_neighbour; |
| 41 | #ifdef CONFIG_XFRM | 41 | #ifdef CONFIG_XFRM |
| 42 | struct xfrm_state *xfrm; | 42 | struct xfrm_state *xfrm; |
| 43 | #else | 43 | #else |
| @@ -88,12 +88,17 @@ struct dst_entry { | |||
| 88 | 88 | ||
| 89 | static inline struct neighbour *dst_get_neighbour(struct dst_entry *dst) | 89 | static inline struct neighbour *dst_get_neighbour(struct dst_entry *dst) |
| 90 | { | 90 | { |
| 91 | return dst->_neighbour; | 91 | return rcu_dereference(dst->_neighbour); |
| 92 | } | ||
| 93 | |||
| 94 | static inline struct neighbour *dst_get_neighbour_raw(struct dst_entry *dst) | ||
| 95 | { | ||
| 96 | return rcu_dereference_raw(dst->_neighbour); | ||
| 92 | } | 97 | } |
| 93 | 98 | ||
| 94 | static inline void dst_set_neighbour(struct dst_entry *dst, struct neighbour *neigh) | 99 | static inline void dst_set_neighbour(struct dst_entry *dst, struct neighbour *neigh) |
| 95 | { | 100 | { |
| 96 | dst->_neighbour = neigh; | 101 | rcu_assign_pointer(dst->_neighbour, neigh); |
| 97 | } | 102 | } |
| 98 | 103 | ||
| 99 | extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old); | 104 | extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old); |
| @@ -382,8 +387,12 @@ static inline void dst_rcu_free(struct rcu_head *head) | |||
| 382 | static inline void dst_confirm(struct dst_entry *dst) | 387 | static inline void dst_confirm(struct dst_entry *dst) |
| 383 | { | 388 | { |
| 384 | if (dst) { | 389 | if (dst) { |
| 385 | struct neighbour *n = dst_get_neighbour(dst); | 390 | struct neighbour *n; |
| 391 | |||
| 392 | rcu_read_lock(); | ||
| 393 | n = dst_get_neighbour(dst); | ||
| 386 | neigh_confirm(n); | 394 | neigh_confirm(n); |
| 395 | rcu_read_unlock(); | ||
| 387 | } | 396 | } |
| 388 | } | 397 | } |
| 389 | 398 | ||
diff --git a/include/net/netlabel.h b/include/net/netlabel.h index f21a16ee3705..f67440970d7e 100644 --- a/include/net/netlabel.h +++ b/include/net/netlabel.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * The NetLabel system manages static and dynamic label mappings for network | 4 | * The NetLabel system manages static and dynamic label mappings for network |
| 5 | * protocols such as CIPSO and RIPSO. | 5 | * protocols such as CIPSO and RIPSO. |
| 6 | * | 6 | * |
| 7 | * Author: Paul Moore <paul.moore@hp.com> | 7 | * Author: Paul Moore <paul@paul-moore.com> |
| 8 | * | 8 | * |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
