please apply to 2.6.
thanks!
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
# 2005/01/14 08:47:48-05:00 chas@xxxxxxxxxxxxxxxxxxxxxx
# [ATM]: avoid race between svc_disconnect and sigd exiting
#
# Signed-off-by: Chas Williams <chas@xxxxxxxxxxxxxxxx>
#
# net/atm/svc.c
# 2005/01/14 08:47:31-05:00 chas@xxxxxxxxxxxxxxxxxxxxxx +4 -7
# [ATM]: avoid race between svc_disconnect and sigd exiting
#
# Signed-off-by: Chas Williams <chas@xxxxxxxxxxxxxxxx>
#
diff -Nru a/net/atm/svc.c b/net/atm/svc.c
--- a/net/atm/svc.c 2005-01-14 08:49:39 -05:00
+++ b/net/atm/svc.c 2005-01-14 08:49:39 -05:00
@@ -71,9 +71,7 @@
sigd_enq2(NULL,as_reject,vcc,NULL,NULL,&vcc->qos,0);
dev_kfree_skb(skb);
}
- clear_bit(ATM_VF_REGIS,&vcc->flags);
- clear_bit(ATM_VF_RELEASED,&vcc->flags);
- clear_bit(ATM_VF_CLOSE,&vcc->flags);
+ clear_bit(ATM_VF_REGIS, &vcc->flags);
/* ... may retry later */
}
@@ -90,10 +88,8 @@
/* VCC pointer is used as a reference, so we must not free it
(thereby subjecting it to re-use) before all pending
connections
are closed */
- sock_hold(sk);
- vcc_release(sock);
svc_disconnect(vcc);
- sock_put(sk);
+ vcc_release(sock);
}
return 0;
}
@@ -286,7 +282,8 @@
*/
if (!(error = vcc_connect(sock, vcc->itf, vcc->vpi, vcc->vci)))
sock->state = SS_CONNECTED;
- else (void) svc_disconnect(vcc);
+ else
+ (void) svc_disconnect(vcc);
out:
release_sock(sk);
return error;
|