patch-2.4.22 linux-2.4.22/drivers/atm/atmtcp.c
Next file: linux-2.4.22/drivers/atm/eni.c
Previous file: linux-2.4.22/drivers/atm/ambassador.c
Back to the patch index
Back to the overall index
- Lines: 148
- Date:
2003-08-25 04:44:41.000000000 -0700
- Orig file:
linux-2.4.21/drivers/atm/atmtcp.c
- Orig date:
2002-11-28 15:53:12.000000000 -0800
diff -urN linux-2.4.21/drivers/atm/atmtcp.c linux-2.4.22/drivers/atm/atmtcp.c
@@ -153,6 +153,7 @@
static int atmtcp_v_ioctl(struct atm_dev *dev,unsigned int cmd,void *arg)
{
+ unsigned long flags;
struct atm_cirange ci;
struct atm_vcc *vcc;
@@ -162,9 +163,14 @@
if (ci.vci_bits == ATM_CI_MAX) ci.vci_bits = MAX_VCI_BITS;
if (ci.vpi_bits > MAX_VPI_BITS || ci.vpi_bits < 0 ||
ci.vci_bits > MAX_VCI_BITS || ci.vci_bits < 0) return -EINVAL;
+ spin_lock_irqsave(&dev->lock, flags);
for (vcc = dev->vccs; vcc; vcc = vcc->next)
if ((vcc->vpi >> ci.vpi_bits) ||
- (vcc->vci >> ci.vci_bits)) return -EBUSY;
+ (vcc->vci >> ci.vci_bits)) {
+ spin_unlock_irqrestore(&dev->lock, flags);
+ return -EBUSY;
+ }
+ spin_unlock_irqrestore(&dev->lock, flags);
dev->ci_range = ci;
return 0;
}
@@ -227,6 +233,7 @@
static void atmtcp_c_close(struct atm_vcc *vcc)
{
+ unsigned long flags;
struct atm_dev *atmtcp_dev;
struct atmtcp_dev_data *dev_data;
struct atm_vcc *walk;
@@ -239,13 +246,16 @@
kfree(dev_data);
shutdown_atm_dev(atmtcp_dev);
vcc->dev_data = NULL;
+ spin_lock_irqsave(&atmtcp_dev->lock, flags);
for (walk = atmtcp_dev->vccs; walk; walk = walk->next)
wake_up(&walk->sleep);
+ spin_unlock_irqrestore(&atmtcp_dev->lock, flags);
}
static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb)
{
+ unsigned long flags;
struct atm_dev *dev;
struct atmtcp_hdr *hdr;
struct atm_vcc *out_vcc;
@@ -260,11 +270,13 @@
(struct atmtcp_control *) skb->data);
goto done;
}
+ spin_lock_irqsave(&dev->lock, flags);
for (out_vcc = dev->vccs; out_vcc; out_vcc = out_vcc->next)
if (out_vcc->vpi == ntohs(hdr->vpi) &&
out_vcc->vci == ntohs(hdr->vci) &&
out_vcc->qos.rxtp.traffic_class != ATM_NONE)
break;
+ spin_unlock_irqrestore(&dev->lock, flags);
if (!out_vcc) {
atomic_inc(&vcc->stats->tx_err);
goto done;
@@ -293,13 +305,13 @@
static struct atmdev_ops atmtcp_v_dev_ops = {
- dev_close: atmtcp_v_dev_close,
- open: atmtcp_v_open,
- close: atmtcp_v_close,
- ioctl: atmtcp_v_ioctl,
- send: atmtcp_v_send,
- proc_read: atmtcp_v_proc,
- owner: THIS_MODULE
+ .dev_close = atmtcp_v_dev_close,
+ .open = atmtcp_v_open,
+ .close = atmtcp_v_close,
+ .ioctl = atmtcp_v_ioctl,
+ .send = atmtcp_v_send,
+ .proc_read = atmtcp_v_proc,
+ .owner = THIS_MODULE
};
@@ -309,21 +321,16 @@
static struct atmdev_ops atmtcp_c_dev_ops = {
- close: atmtcp_c_close,
- send: atmtcp_c_send
+ .close = atmtcp_c_close,
+ .send = atmtcp_c_send
};
static struct atm_dev atmtcp_control_dev = {
- &atmtcp_c_dev_ops,
- NULL, /* no PHY */
- "atmtcp", /* type */
- 999, /* dummy device number */
- NULL,NULL, /* pretend not to have any VCCs */
- NULL,NULL, /* no data */
- { 0 }, /* no flags */
- NULL, /* no local address */
- { 0 } /* no ESI, no statistics */
+ .ops = &atmtcp_c_dev_ops,
+ .type = "atmtcp",
+ .number = 999,
+ .lock = SPIN_LOCK_UNLOCKED
};
@@ -356,9 +363,12 @@
struct atm_dev *dev;
dev = NULL;
- if (itf != -1) dev = atm_find_dev(itf);
+ if (itf != -1) dev = atm_dev_lookup(itf);
if (dev) {
- if (dev->ops != &atmtcp_v_dev_ops) return -EMEDIUMTYPE;
+ if (dev->ops != &atmtcp_v_dev_ops) {
+ atm_dev_release(dev);
+ return -EMEDIUMTYPE;
+ }
if (PRIV(dev)->vcc) return -EBUSY;
}
else {
@@ -389,14 +399,18 @@
struct atm_dev *dev;
struct atmtcp_dev_data *dev_data;
- dev = atm_find_dev(itf);
+ dev = atm_dev_lookup(itf);
if (!dev) return -ENODEV;
- if (dev->ops != &atmtcp_v_dev_ops) return -EMEDIUMTYPE;
+ if (dev->ops != &atmtcp_v_dev_ops) {
+ atm_dev_release(dev);
+ return -EMEDIUMTYPE;
+ }
dev_data = PRIV(dev);
if (!dev_data->persist) return 0;
dev_data->persist = 0;
if (PRIV(dev)->vcc) return 0;
kfree(dev_data);
+ atm_dev_release(dev);
shutdown_atm_dev(dev);
return 0;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)