diff options
| author | Pavel Emelyanov <xemul@openvz.org> | 2007-10-18 08:15:57 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2007-10-18 08:15:57 -0400 |
| commit | bd0bf57700cb0eaa92f3d2ee040a69743cdd99d0 (patch) | |
| tree | 0233529f1a744599e46799050060ab6f65fecffd /net | |
| parent | 04028045a12ba941c579d0f3238489333ac18ea4 (diff) | |
[IPV6]: Lost locking in fl6_sock_lookup
This routine scans the ipv6_fl_list whose update is
protected with the socket lock and the ip6_sk_fl_lock.
Since the socket lock is not taken in the lookup, use
the other one.
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
| -rw-r--r-- | net/ipv6/ip6_flowlabel.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c index 8550df20f984..f40a08669db0 100644 --- a/net/ipv6/ip6_flowlabel.c +++ b/net/ipv6/ip6_flowlabel.c | |||
| @@ -190,14 +190,17 @@ struct ip6_flowlabel * fl6_sock_lookup(struct sock *sk, __be32 label) | |||
| 190 | 190 | ||
| 191 | label &= IPV6_FLOWLABEL_MASK; | 191 | label &= IPV6_FLOWLABEL_MASK; |
| 192 | 192 | ||
| 193 | read_lock_bh(&ip6_sk_fl_lock); | ||
| 193 | for (sfl=np->ipv6_fl_list; sfl; sfl = sfl->next) { | 194 | for (sfl=np->ipv6_fl_list; sfl; sfl = sfl->next) { |
| 194 | struct ip6_flowlabel *fl = sfl->fl; | 195 | struct ip6_flowlabel *fl = sfl->fl; |
| 195 | if (fl->label == label) { | 196 | if (fl->label == label) { |
| 197 | read_unlock_bh(&ip6_sk_fl_lock); | ||
| 196 | fl->lastuse = jiffies; | 198 | fl->lastuse = jiffies; |
| 197 | atomic_inc(&fl->users); | 199 | atomic_inc(&fl->users); |
| 198 | return fl; | 200 | return fl; |
| 199 | } | 201 | } |
| 200 | } | 202 | } |
| 203 | read_unlock_bh(&ip6_sk_fl_lock); | ||
| 201 | return NULL; | 204 | return NULL; |
| 202 | } | 205 | } |
| 203 | 206 | ||
