patch-2.4.22 linux-2.4.22/net/atm/atm_misc.c
Next file: linux-2.4.22/net/atm/br2684.c
Previous file: linux-2.4.22/net/atm/addr.c
Back to the patch index
Back to the overall index
- Lines: 38
- Date:
2003-08-25 04:44:44.000000000 -0700
- Orig file:
linux-2.4.21/net/atm/atm_misc.c
- Orig date:
2003-06-13 07:51:39.000000000 -0700
diff -urN linux-2.4.21/net/atm/atm_misc.c linux-2.4.22/net/atm/atm_misc.c
@@ -63,13 +63,19 @@
int atm_find_ci(struct atm_vcc *vcc,short *vpi,int *vci)
{
+ unsigned long flags;
static short p = 0; /* poor man's per-device cache */
static int c = 0;
short old_p;
int old_c;
+ int err;
- if (*vpi != ATM_VPI_ANY && *vci != ATM_VCI_ANY)
- return check_ci(vcc,*vpi,*vci);
+ spin_lock_irqsave(&vcc->dev->lock, flags);
+ if (*vpi != ATM_VPI_ANY && *vci != ATM_VCI_ANY) {
+ err = check_ci(vcc,*vpi,*vci);
+ spin_unlock_irqrestore(&vcc->dev->lock, flags);
+ return err;
+ }
/* last scan may have left values out of bounds for current device */
if (*vpi != ATM_VPI_ANY) p = *vpi;
else if (p >= 1 << vcc->dev->ci_range.vpi_bits) p = 0;
@@ -82,6 +88,7 @@
if (!check_ci(vcc,p,c)) {
*vpi = p;
*vci = c;
+ spin_unlock_irqrestore(&vcc->dev->lock, flags);
return 0;
}
if (*vci == ATM_VCI_ANY) {
@@ -96,6 +103,7 @@
}
}
while (old_p != p || old_c != c);
+ spin_unlock_irqrestore(&vcc->dev->lock, flags);
return -EADDRINUSE;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)