diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/ipvs/ip_vs_conn.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c index d8f7e8ef67b..ff04e9edbed 100644 --- a/net/netfilter/ipvs/ip_vs_conn.c +++ b/net/netfilter/ipvs/ip_vs_conn.c | |||
@@ -162,6 +162,7 @@ static inline int ip_vs_conn_hash(struct ip_vs_conn *cp) | |||
162 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); | 162 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); |
163 | 163 | ||
164 | ct_write_lock(hash); | 164 | ct_write_lock(hash); |
165 | spin_lock(&cp->lock); | ||
165 | 166 | ||
166 | if (!(cp->flags & IP_VS_CONN_F_HASHED)) { | 167 | if (!(cp->flags & IP_VS_CONN_F_HASHED)) { |
167 | list_add(&cp->c_list, &ip_vs_conn_tab[hash]); | 168 | list_add(&cp->c_list, &ip_vs_conn_tab[hash]); |
@@ -174,6 +175,7 @@ static inline int ip_vs_conn_hash(struct ip_vs_conn *cp) | |||
174 | ret = 0; | 175 | ret = 0; |
175 | } | 176 | } |
176 | 177 | ||
178 | spin_unlock(&cp->lock); | ||
177 | ct_write_unlock(hash); | 179 | ct_write_unlock(hash); |
178 | 180 | ||
179 | return ret; | 181 | return ret; |
@@ -193,6 +195,7 @@ static inline int ip_vs_conn_unhash(struct ip_vs_conn *cp) | |||
193 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); | 195 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); |
194 | 196 | ||
195 | ct_write_lock(hash); | 197 | ct_write_lock(hash); |
198 | spin_lock(&cp->lock); | ||
196 | 199 | ||
197 | if (cp->flags & IP_VS_CONN_F_HASHED) { | 200 | if (cp->flags & IP_VS_CONN_F_HASHED) { |
198 | list_del(&cp->c_list); | 201 | list_del(&cp->c_list); |
@@ -202,6 +205,7 @@ static inline int ip_vs_conn_unhash(struct ip_vs_conn *cp) | |||
202 | } else | 205 | } else |
203 | ret = 0; | 206 | ret = 0; |
204 | 207 | ||
208 | spin_unlock(&cp->lock); | ||
205 | ct_write_unlock(hash); | 209 | ct_write_unlock(hash); |
206 | 210 | ||
207 | return ret; | 211 | return ret; |