提交 9301e320 编写于 作者: C Chas Williams 提交者: David S. Miller

[ATM]: track and close listen sockets when sigd exits

Signed-off-by: NChas Williams <chas@cmf.nrl.navy.mil>
上级 e2c4b721
...@@ -178,8 +178,6 @@ static void vcc_destroy_socket(struct sock *sk) ...@@ -178,8 +178,6 @@ static void vcc_destroy_socket(struct sock *sk)
if (vcc->push) if (vcc->push)
vcc->push(vcc, NULL); /* atmarpd has no push */ vcc->push(vcc, NULL); /* atmarpd has no push */
vcc_remove_socket(sk); /* no more receive */
while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) { while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
atm_return(vcc,skb->truesize); atm_return(vcc,skb->truesize);
kfree_skb(skb); kfree_skb(skb);
...@@ -188,6 +186,8 @@ static void vcc_destroy_socket(struct sock *sk) ...@@ -188,6 +186,8 @@ static void vcc_destroy_socket(struct sock *sk)
module_put(vcc->dev->ops->owner); module_put(vcc->dev->ops->owner);
atm_dev_put(vcc->dev); atm_dev_put(vcc->dev);
} }
vcc_remove_socket(sk);
} }
......
...@@ -217,8 +217,9 @@ void sigd_enq(struct atm_vcc *vcc,enum atmsvc_msg_type type, ...@@ -217,8 +217,9 @@ void sigd_enq(struct atm_vcc *vcc,enum atmsvc_msg_type type,
static void purge_vcc(struct atm_vcc *vcc) static void purge_vcc(struct atm_vcc *vcc)
{ {
if (sk_atm(vcc)->sk_family == PF_ATMSVC && if (sk_atm(vcc)->sk_family == PF_ATMSVC &&
!test_bit(ATM_VF_META,&vcc->flags)) { !test_bit(ATM_VF_META, &vcc->flags)) {
set_bit(ATM_VF_RELEASED,&vcc->flags); set_bit(ATM_VF_RELEASED, &vcc->flags);
clear_bit(ATM_VF_REGIS, &vcc->flags);
vcc_release_async(vcc, -EUNATCH); vcc_release_async(vcc, -EUNATCH);
} }
} }
...@@ -243,8 +244,7 @@ static void sigd_close(struct atm_vcc *vcc) ...@@ -243,8 +244,7 @@ static void sigd_close(struct atm_vcc *vcc)
sk_for_each(s, node, head) { sk_for_each(s, node, head) {
struct atm_vcc *vcc = atm_sk(s); struct atm_vcc *vcc = atm_sk(s);
if (vcc->dev) purge_vcc(vcc);
purge_vcc(vcc);
} }
} }
read_unlock(&vcc_sklist_lock); read_unlock(&vcc_sklist_lock);
......
...@@ -302,6 +302,7 @@ static int svc_listen(struct socket *sock,int backlog) ...@@ -302,6 +302,7 @@ static int svc_listen(struct socket *sock,int backlog)
error = -EINVAL; error = -EINVAL;
goto out; goto out;
} }
vcc_insert_socket(sk);
set_bit(ATM_VF_WAITING, &vcc->flags); set_bit(ATM_VF_WAITING, &vcc->flags);
prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE); prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local); sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册