[ATM]: always return the first interface for ATM_ITF_ANY
authorMitchell Blank Jr <mitch@sfgoth.com>
Wed, 30 Nov 2005 00:13:32 +0000 (16:13 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 30 Nov 2005 00:13:32 +0000 (16:13 -0800)
From: Mitchell Blank Jr <mitch@sfgoth.com>
Signed-off-by: Chas Williams <chas@cmf.nrl.navy.mil>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/atm/common.c

index 63feea49fb139f6a0e96888c3f4f99c2325ac883..83454e12317d1518562925f0ed27712895db441f 100644 (file)
@@ -423,33 +423,23 @@ int vcc_connect(struct socket *sock, int itf, short vpi, int vci)
        if (vcc->qos.txtp.traffic_class == ATM_ANYCLASS ||
            vcc->qos.rxtp.traffic_class == ATM_ANYCLASS)
                return -EINVAL;
-       if (itf != ATM_ITF_ANY) {
+       if (likely(itf != ATM_ITF_ANY)) {
                dev = atm_dev_lookup(itf);
-               if (!dev)
-                       return -ENODEV;
-               error = __vcc_connect(vcc, dev, vpi, vci);
-               if (error) {
-                       atm_dev_put(dev);
-                       return error;
-               }
        } else {
-               struct list_head *p, *next;
-
                dev = NULL;
                spin_lock(&atm_dev_lock);
-               list_for_each_safe(p, next, &atm_devs) {
-                       dev = list_entry(p, struct atm_dev, dev_list);
+               if (!list_empty(&atm_devs)) {
+                       dev = list_entry(atm_devs.next, struct atm_dev, dev_list);
                        atm_dev_hold(dev);
-                       spin_unlock(&atm_dev_lock);
-                       if (!__vcc_connect(vcc, dev, vpi, vci))
-                               break;
-                       atm_dev_put(dev);
-                       dev = NULL;
-                       spin_lock(&atm_dev_lock);
                }
                spin_unlock(&atm_dev_lock);
-               if (!dev)
-                       return -ENODEV;
+       }
+       if (!dev)
+               return -ENODEV;
+       error = __vcc_connect(vcc, dev, vpi, vci);
+       if (error) {
+               atm_dev_put(dev);
+               return error;
        }
        if (vpi == ATM_VPI_UNSPEC || vci == ATM_VCI_UNSPEC)
                set_bit(ATM_VF_PARTIAL,&vcc->flags);