This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / drivers / atm / atmtcp.c
index 381e9c1..0572f72 100644 (file)
@@ -271,28 +271,6 @@ static void atmtcp_c_close(struct atm_vcc *vcc)
                }
        }
        read_unlock(&vcc_sklist_lock);
-       module_put(THIS_MODULE);
-}
-
-
-static struct atm_vcc *find_vcc(struct atm_dev *dev, short vpi, int vci)
-{
-        struct hlist_head *head;
-        struct atm_vcc *vcc;
-        struct hlist_node *node;
-        struct sock *s;
-
-        head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)];
-
-        sk_for_each(s, node, head) {
-                vcc = atm_sk(s);
-                if (vcc->dev == dev &&
-                    vcc->vci == vci && vcc->vpi == vpi &&
-                    vcc->qos.rxtp.traffic_class != ATM_NONE) {
-                                return vcc;
-                }
-        }
-        return NULL;
 }
 
 
@@ -300,9 +278,11 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb)
 {
        struct atm_dev *dev;
        struct atmtcp_hdr *hdr;
-       struct atm_vcc *out_vcc;
+       struct sock *s;
+       struct hlist_node *node;
+       struct atm_vcc *out_vcc = NULL;
        struct sk_buff *new_skb;
-       int result = 0;
+       int i, result = 0;
 
        if (!skb->len) return 0;
        dev = vcc->dev_data;
@@ -313,7 +293,19 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb)
                goto done;
        }
        read_lock(&vcc_sklist_lock);
-       out_vcc = find_vcc(dev, ntohs(hdr->vpi), ntohs(hdr->vci));
+       for(i = 0; i < VCC_HTABLE_SIZE; ++i) {
+               struct hlist_head *head = &vcc_hash[i];
+
+               sk_for_each(s, node, head) {
+                       out_vcc = atm_sk(s);
+                       if (out_vcc->dev != dev)
+                               continue;
+                       if (out_vcc->vpi == ntohs(hdr->vpi) &&
+                           out_vcc->vci == ntohs(hdr->vci) &&
+                           out_vcc->qos.rxtp.traffic_class != ATM_NONE)
+                               break;
+               }
+       }
        read_unlock(&vcc_sklist_lock);
        if (!out_vcc) {
                atomic_inc(&vcc->stats->tx_err);