patch-2.4.21 linux-2.4.21/drivers/isdn/avmb1/capidrv.c
Next file: linux-2.4.21/drivers/isdn/avmb1/kcapi.c
Previous file: linux-2.4.21/drivers/isdn/Config.in
Back to the patch index
Back to the overall index
- Lines: 56
- Date:
2003-06-13 07:51:34.000000000 -0700
- Orig file:
linux-2.4.20/drivers/isdn/avmb1/capidrv.c
- Orig date:
2001-12-21 09:41:54.000000000 -0800
diff -urN linux-2.4.20/drivers/isdn/avmb1/capidrv.c linux-2.4.21/drivers/isdn/avmb1/capidrv.c
@@ -105,6 +105,7 @@
int oldstate;
/* */
__u16 datahandle;
+ spinlock_t lock;
struct ncci_datahandle_queue {
struct ncci_datahandle_queue *next;
__u16 datahandle;
@@ -422,6 +423,7 @@
nccip->plcip = plcip;
nccip->chan = plcip->chan;
nccip->datahandle = 0;
+ nccip->lock = SPIN_LOCK_UNLOCKED;
nccip->next = plcip->ncci_list;
plcip->ncci_list = nccip;
@@ -478,6 +480,7 @@
__u16 datahandle, int len)
{
struct ncci_datahandle_queue *n, **pp;
+ unsigned long flags;
n = (struct ncci_datahandle_queue *)
kmalloc(sizeof(struct ncci_datahandle_queue), GFP_ATOMIC);
@@ -488,25 +491,31 @@
n->next = 0;
n->datahandle = datahandle;
n->len = len;
+ spin_lock_irqsave(&nccip->lock, flags);
for (pp = &nccip->ackqueue; *pp; pp = &(*pp)->next) ;
*pp = n;
+ spin_unlock_irqrestore(&nccip->lock, flags);
return 0;
}
static int capidrv_del_ack(struct capidrv_ncci *nccip, __u16 datahandle)
{
struct ncci_datahandle_queue **pp, *p;
+ unsigned long flags;
int len;
+ spin_lock_irqsave(&nccip->lock, flags);
for (pp = &nccip->ackqueue; *pp; pp = &(*pp)->next) {
if ((*pp)->datahandle == datahandle) {
p = *pp;
len = p->len;
*pp = (*pp)->next;
+ spin_unlock_irqrestore(&nccip->lock, flags);
kfree(p);
return len;
}
}
+ spin_unlock_irqrestore(&nccip->lock, flags);
return -1;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)