diff options
| -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); |
