patch-2.4.23 linux-2.4.23/net/atm/signaling.c
Next file: linux-2.4.23/net/atm/svc.c
Previous file: linux-2.4.23/net/atm/resources.h
Back to the patch index
Back to the overall index
- Lines: 102
- Date:
2003-11-28 10:26:21.000000000 -0800
- Orig file:
linux-2.4.22/net/atm/signaling.c
- Orig date:
2003-08-25 04:44:44.000000000 -0700
diff -urN linux-2.4.22/net/atm/signaling.c linux-2.4.23/net/atm/signaling.c
@@ -124,26 +124,31 @@
clear_bit(ATM_VF_REGIS,&vcc->flags);
clear_bit(ATM_VF_READY,&vcc->flags);
vcc->reply = msg->reply;
+ vcc->sk->err = -msg->reply;
break;
case as_indicate:
vcc = *(struct atm_vcc **) &msg->listen_vcc;
DPRINTK("as_indicate!!!\n");
- if (!vcc->backlog_quota) {
+ lock_sock(vcc->sk);
+ if (vcc->sk->ack_backlog == vcc->sk->max_ack_backlog) {
sigd_enq(0,as_reject,vcc,NULL,NULL);
- return 0;
+ goto as_indicate_complete;
}
- vcc->backlog_quota--;
- skb_queue_tail(&vcc->listenq,skb);
+ vcc->sk->ack_backlog++;
+ skb_queue_tail(&vcc->sk->receive_queue,skb);
if (vcc->callback) {
DPRINTK("waking vcc->sleep 0x%p\n",
&vcc->sleep);
vcc->callback(vcc);
}
+as_indicate_complete:
+ release_sock(vcc->sk);
return 0;
case as_close:
set_bit(ATM_VF_RELEASED,&vcc->flags);
clear_bit(ATM_VF_READY,&vcc->flags);
vcc->reply = msg->reply;
+ vcc->sk->err = -msg->reply;
break;
case as_modify:
modify_qos(vcc,msg);
@@ -194,25 +199,21 @@
}
-static void purge_vccs(struct atm_vcc *vcc)
+static void purge_vcc(struct atm_vcc *vcc)
{
- while (vcc) {
- if (vcc->sk->family == PF_ATMSVC &&
- !test_bit(ATM_VF_META,&vcc->flags)) {
- set_bit(ATM_VF_RELEASED,&vcc->flags);
- vcc->reply = -EUNATCH;
- wake_up(&vcc->sleep);
- }
- vcc = vcc->next;
+ if (vcc->sk->family == PF_ATMSVC &&
+ !test_bit(ATM_VF_META, &vcc->flags)) {
+ set_bit(ATM_VF_RELEASED, &vcc->flags);
+ vcc->reply = -EUNATCH;
+ vcc->sk->err = EUNATCH;
+ wake_up(&vcc->sleep);
}
}
static void sigd_close(struct atm_vcc *vcc)
{
- unsigned long flags;
- struct atm_dev *dev;
- struct list_head *p;
+ struct sock *s;
DPRINTK("sigd_close\n");
sigd = NULL;
@@ -220,14 +221,14 @@
printk(KERN_ERR "sigd_close: closing with requests pending\n");
skb_queue_purge(&vcc->sk->receive_queue);
- spin_lock(&atm_dev_lock);
- list_for_each(p, &atm_devs) {
- dev = list_entry(p, struct atm_dev, dev_list);
- spin_lock_irqsave(&dev->lock, flags);
- purge_vccs(dev->vccs);
- spin_unlock_irqrestore(&dev->lock, flags);
+ read_lock(&vcc_sklist_lock);
+ for(s = vcc_sklist; s; s = s->next) {
+ struct atm_vcc *vcc = s->protinfo.af_atm;
+
+ if (vcc->dev)
+ purge_vcc(vcc);
}
- spin_unlock(&atm_dev_lock);
+ read_unlock(&vcc_sklist_lock);
}
@@ -250,7 +251,8 @@
if (sigd) return -EADDRINUSE;
DPRINTK("sigd_attach\n");
sigd = vcc;
- bind_vcc(vcc,&sigd_dev);
+ vcc->dev = &sigd_dev;
+ vcc_insert_socket(vcc->sk);
set_bit(ATM_VF_META,&vcc->flags);
set_bit(ATM_VF_READY,&vcc->flags);
wake_up(&sigd_sleep);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)