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