[ATM]: track and close listen sockets when sigd exits
Signed-off-by: Chas Williams <chas@cmf.nrl.navy.mil>
This commit is contained in:
parent
e2c4b72158
commit
9301e320e9
|
@ -178,8 +178,6 @@ static void vcc_destroy_socket(struct sock *sk)
|
|||
if (vcc->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) {
|
||||
atm_return(vcc,skb->truesize);
|
||||
kfree_skb(skb);
|
||||
|
@ -188,6 +186,8 @@ static void vcc_destroy_socket(struct sock *sk)
|
|||
module_put(vcc->dev->ops->owner);
|
||||
atm_dev_put(vcc->dev);
|
||||
}
|
||||
|
||||
vcc_remove_socket(sk);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -219,6 +219,7 @@ static void purge_vcc(struct atm_vcc *vcc)
|
|||
if (sk_atm(vcc)->sk_family == PF_ATMSVC &&
|
||||
!test_bit(ATM_VF_META, &vcc->flags)) {
|
||||
set_bit(ATM_VF_RELEASED, &vcc->flags);
|
||||
clear_bit(ATM_VF_REGIS, &vcc->flags);
|
||||
vcc_release_async(vcc, -EUNATCH);
|
||||
}
|
||||
}
|
||||
|
@ -243,7 +244,6 @@ static void sigd_close(struct atm_vcc *vcc)
|
|||
sk_for_each(s, node, head) {
|
||||
struct atm_vcc *vcc = atm_sk(s);
|
||||
|
||||
if (vcc->dev)
|
||||
purge_vcc(vcc);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -302,6 +302,7 @@ static int svc_listen(struct socket *sock,int backlog)
|
|||
error = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
vcc_insert_socket(sk);
|
||||
set_bit(ATM_VF_WAITING, &vcc->flags);
|
||||
prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
|
||||
sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local);
|
||||
|
|
Loading…
Reference in a new issue