Hi, 

1 - couldn't there be a problem through :
atm_release/svc_release -> atm_release_vcc_sk (...vcc->dev->ops->close) -> 
sigd_close -> *atm_devs walk* 

2 - 
> --- linux-2.4.0-test10-pre4.clean/net/atm/common.c    Wed Jul 12 12:26:08 2000
> +++ linux-2.4.0-test10-pre4.fs50/net/atm/common.c     Thu Oct 19 14:42:11 2000
[...]
> @@ -252,13 +256,26 @@
>  static int atm_do_connect(struct atm_vcc *vcc,int itf,int vpi,int vci)
>  {
>       struct atm_dev *dev;
> +     int return_val;
>  
> +     printk ("lock %s\n", __FUNCTION__);
> +     spin_lock (&atm_dev_lock);
> +     printk ("Before find device\n");
>       dev = atm_find_dev(itf);
> -     if (!dev) return -ENODEV;
> -     return atm_do_connect_dev(vcc,dev,vpi,vci);
> +     printk ("After find device\n");
> +     if (!dev){
> +              spin_unlock (&atm_dev_lock);
> +              printk ("spin unlock\n");
> +              return -ENODEV;
> +     }
> +     return_val = atm_do_connect_dev(vcc,dev,vpi,vci);
> +     spin_unlock (&atm_dev_lock);

        if (!dev) {
                return_val = -ENODEV;
                goto done;
        }
        return_val = atm_do_connect_dev(vcc,dev,vpi,vci);
done:
        spin_unlock (&atm_dev_lock);
        return return_val;

3 - I haven't seen where bind_vcc may be protected btw:
    186     if (dev) {
    187         vcc->next = NULL;
    188         vcc->prev = dev->last;
    189         if (dev->vccs) dev->last->next = vcc;
    190         else dev->vccs = vcc;
    191         dev->last = vcc;

A       B
                vcc->next = NULL
...
191             dev->last = vcc
...     189     dev->last->next = vcc
-> vcc->next = vcc ?

-- 
Ueimor
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to