diff options
author | Chas Williams <chas@cmf.nrl.navy.mil> | 2005-09-28 19:35:01 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-09-28 19:35:01 -0400 |
commit | 9301e320e98ff19a0e48881b038d0c24ca76e6c0 (patch) | |
tree | b625aa1cb6dab99f343cdf85e0f32e7838a7ad93 /net/atm | |
parent | e2c4b72158a9f1286df41dee478e774f1b94e93a (diff) |
[ATM]: track and close listen sockets when sigd exits
Signed-off-by: Chas Williams <chas@cmf.nrl.navy.mil>
Diffstat (limited to 'net/atm')
-rw-r--r-- | net/atm/common.c | 4 | ||||
-rw-r--r-- | net/atm/signaling.c | 8 | ||||
-rw-r--r-- | net/atm/svc.c | 1 |
3 files changed, 7 insertions, 6 deletions
diff --git a/net/atm/common.c b/net/atm/common.c index e93e838069e8..801a5813ec60 100644 --- a/net/atm/common.c +++ b/net/atm/common.c | |||
@@ -178,8 +178,6 @@ static void vcc_destroy_socket(struct sock *sk) | |||
178 | if (vcc->push) | 178 | if (vcc->push) |
179 | vcc->push(vcc, NULL); /* atmarpd has no push */ | 179 | vcc->push(vcc, NULL); /* atmarpd has no push */ |
180 | 180 | ||
181 | vcc_remove_socket(sk); /* no more receive */ | ||
182 | |||
183 | while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) { | 181 | while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) { |
184 | atm_return(vcc,skb->truesize); | 182 | atm_return(vcc,skb->truesize); |
185 | kfree_skb(skb); | 183 | kfree_skb(skb); |
@@ -188,6 +186,8 @@ static void vcc_destroy_socket(struct sock *sk) | |||
188 | module_put(vcc->dev->ops->owner); | 186 | module_put(vcc->dev->ops->owner); |
189 | atm_dev_put(vcc->dev); | 187 | atm_dev_put(vcc->dev); |
190 | } | 188 | } |
189 | |||
190 | vcc_remove_socket(sk); | ||
191 | } | 191 | } |
192 | 192 | ||
193 | 193 | ||
diff --git a/net/atm/signaling.c b/net/atm/signaling.c index f7c449ac1800..e7211a7f382c 100644 --- a/net/atm/signaling.c +++ b/net/atm/signaling.c | |||
@@ -217,8 +217,9 @@ void sigd_enq(struct atm_vcc *vcc,enum atmsvc_msg_type type, | |||
217 | static void purge_vcc(struct atm_vcc *vcc) | 217 | static void purge_vcc(struct atm_vcc *vcc) |
218 | { | 218 | { |
219 | if (sk_atm(vcc)->sk_family == PF_ATMSVC && | 219 | if (sk_atm(vcc)->sk_family == PF_ATMSVC && |
220 | !test_bit(ATM_VF_META,&vcc->flags)) { | 220 | !test_bit(ATM_VF_META, &vcc->flags)) { |
221 | set_bit(ATM_VF_RELEASED,&vcc->flags); | 221 | set_bit(ATM_VF_RELEASED, &vcc->flags); |
222 | clear_bit(ATM_VF_REGIS, &vcc->flags); | ||
222 | vcc_release_async(vcc, -EUNATCH); | 223 | vcc_release_async(vcc, -EUNATCH); |
223 | } | 224 | } |
224 | } | 225 | } |
@@ -243,8 +244,7 @@ static void sigd_close(struct atm_vcc *vcc) | |||
243 | sk_for_each(s, node, head) { | 244 | sk_for_each(s, node, head) { |
244 | struct atm_vcc *vcc = atm_sk(s); | 245 | struct atm_vcc *vcc = atm_sk(s); |
245 | 246 | ||
246 | if (vcc->dev) | 247 | purge_vcc(vcc); |
247 | purge_vcc(vcc); | ||
248 | } | 248 | } |
249 | } | 249 | } |
250 | read_unlock(&vcc_sklist_lock); | 250 | read_unlock(&vcc_sklist_lock); |
diff --git a/net/atm/svc.c b/net/atm/svc.c index 08e46052a3e4..d7b266136bf6 100644 --- a/net/atm/svc.c +++ b/net/atm/svc.c | |||
@@ -302,6 +302,7 @@ static int svc_listen(struct socket *sock,int backlog) | |||
302 | error = -EINVAL; | 302 | error = -EINVAL; |
303 | goto out; | 303 | goto out; |
304 | } | 304 | } |
305 | vcc_insert_socket(sk); | ||
305 | set_bit(ATM_VF_WAITING, &vcc->flags); | 306 | set_bit(ATM_VF_WAITING, &vcc->flags); |
306 | prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE); | 307 | prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE); |
307 | sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local); | 308 | sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local); |