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

Signed-off-by: Chas Williams <chas@cmf.nrl.navy.mil>

authored by Chas Williams and committed by David S. Miller 9301e320 e2c4b721

+7 -6
+2 -2
net/atm/common.c
··· 178 if (vcc->push) 179 vcc->push(vcc, NULL); /* atmarpd has no push */ 180 181 - vcc_remove_socket(sk); /* no more receive */ 182 - 183 while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) { 184 atm_return(vcc,skb->truesize); 185 kfree_skb(skb); ··· 186 module_put(vcc->dev->ops->owner); 187 atm_dev_put(vcc->dev); 188 } 189 } 190 191
··· 178 if (vcc->push) 179 vcc->push(vcc, NULL); /* atmarpd has no push */ 180 181 while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) { 182 atm_return(vcc,skb->truesize); 183 kfree_skb(skb); ··· 188 module_put(vcc->dev->ops->owner); 189 atm_dev_put(vcc->dev); 190 } 191 + 192 + vcc_remove_socket(sk); 193 } 194 195
+4 -4
net/atm/signaling.c
··· 217 static void purge_vcc(struct atm_vcc *vcc) 218 { 219 if (sk_atm(vcc)->sk_family == PF_ATMSVC && 220 - !test_bit(ATM_VF_META,&vcc->flags)) { 221 - set_bit(ATM_VF_RELEASED,&vcc->flags); 222 vcc_release_async(vcc, -EUNATCH); 223 } 224 } ··· 244 sk_for_each(s, node, head) { 245 struct atm_vcc *vcc = atm_sk(s); 246 247 - if (vcc->dev) 248 - purge_vcc(vcc); 249 } 250 } 251 read_unlock(&vcc_sklist_lock);
··· 217 static void purge_vcc(struct atm_vcc *vcc) 218 { 219 if (sk_atm(vcc)->sk_family == PF_ATMSVC && 220 + !test_bit(ATM_VF_META, &vcc->flags)) { 221 + set_bit(ATM_VF_RELEASED, &vcc->flags); 222 + clear_bit(ATM_VF_REGIS, &vcc->flags); 223 vcc_release_async(vcc, -EUNATCH); 224 } 225 } ··· 243 sk_for_each(s, node, head) { 244 struct atm_vcc *vcc = atm_sk(s); 245 246 + purge_vcc(vcc); 247 } 248 } 249 read_unlock(&vcc_sklist_lock);
+1
net/atm/svc.c
··· 302 error = -EINVAL; 303 goto out; 304 } 305 set_bit(ATM_VF_WAITING, &vcc->flags); 306 prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE); 307 sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local);
··· 302 error = -EINVAL; 303 goto out; 304 } 305 + vcc_insert_socket(sk); 306 set_bit(ATM_VF_WAITING, &vcc->flags); 307 prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE); 308 sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local);