This fix is not to rdma_cm but to its backport.

The approach I took to solve the problem is as in suggestion #1 in the bug
report - use the same xxx_ip_dev_find() as the one used in 1.1
Besides RHEL4, I applied the fix to SLES10 as well.
There is no need to fix for RHEL5.
Other backports were not checked.

Reported-by: Philippe Bernadat <philippe.berna...@hp.com>
Debugged-by: Philippe Bernadat <philippe.berna...@hp.com>
Signed-off-by: Moni Shoua <mo...@voltaire.com>
---
 kernel_addons/backport/2.6.16_sles10/include/linux/inetdevice.h     |   22 
++++++----
 kernel_addons/backport/2.6.16_sles10_sp1/include/linux/inetdevice.h |   22 
++++++----
 kernel_addons/backport/2.6.16_sles10_sp2/include/linux/inetdevice.h |   22 
++++++----
 kernel_addons/backport/2.6.9_U4/include/linux/inetdevice.h          |   22 
++++++----
 kernel_addons/backport/2.6.9_U5/include/linux/inetdevice.h          |   22 
++++++----
 kernel_addons/backport/2.6.9_U6/include/linux/inetdevice.h          |   22 
++++++----
 kernel_addons/backport/2.6.9_U7/include/linux/inetdevice.h          |   22 
++++++----
 7 files changed, 105 insertions(+), 49 deletions(-)

diff --git a/kernel_addons/backport/2.6.16_sles10/include/linux/inetdevice.h 
b/kernel_addons/backport/2.6.16_sles10/include/linux/inetdevice.h
index 4ef1826..c2fefbc 100644
--- a/kernel_addons/backport/2.6.16_sles10/include/linux/inetdevice.h
+++ b/kernel_addons/backport/2.6.16_sles10/include/linux/inetdevice.h
@@ -7,16 +7,24 @@
 static inline struct net_device *xxx_ip_dev_find(u32 addr)
 {
        struct net_device *dev;
-       u32 ip;
+       struct in_ifaddr **ifap;
+       struct in_ifaddr *ifa;
+       struct in_device *in_dev;
 
        read_lock(&dev_base_lock);
-       for (dev = dev_base; dev; dev = dev->next) {
-               ip = inet_select_addr(dev, 0, RT_SCOPE_HOST);
-               if (ip == addr) {
-                       dev_hold(dev);
-                       break;
+       for (dev = dev_base; dev; dev = dev->next)
+               if ((in_dev = in_dev_get(dev))) {
+                       for (ifap = &in_dev->ifa_list; (ifa = *ifap);
+                            ifap = &ifa->ifa_next) {
+                               if (addr == ifa->ifa_address) {
+                                       dev_hold(dev);
+                                       in_dev_put(in_dev);
+                                       goto found;
+                               }
+                       }
+                       in_dev_put(in_dev);
                }
-       }
+found:
        read_unlock(&dev_base_lock);
 
        return dev;
diff --git 
a/kernel_addons/backport/2.6.16_sles10_sp1/include/linux/inetdevice.h 
b/kernel_addons/backport/2.6.16_sles10_sp1/include/linux/inetdevice.h
index 4ef1826..c2fefbc 100644
--- a/kernel_addons/backport/2.6.16_sles10_sp1/include/linux/inetdevice.h
+++ b/kernel_addons/backport/2.6.16_sles10_sp1/include/linux/inetdevice.h
@@ -7,16 +7,24 @@
 static inline struct net_device *xxx_ip_dev_find(u32 addr)
 {
        struct net_device *dev;
-       u32 ip;
+       struct in_ifaddr **ifap;
+       struct in_ifaddr *ifa;
+       struct in_device *in_dev;
 
        read_lock(&dev_base_lock);
-       for (dev = dev_base; dev; dev = dev->next) {
-               ip = inet_select_addr(dev, 0, RT_SCOPE_HOST);
-               if (ip == addr) {
-                       dev_hold(dev);
-                       break;
+       for (dev = dev_base; dev; dev = dev->next)
+               if ((in_dev = in_dev_get(dev))) {
+                       for (ifap = &in_dev->ifa_list; (ifa = *ifap);
+                            ifap = &ifa->ifa_next) {
+                               if (addr == ifa->ifa_address) {
+                                       dev_hold(dev);
+                                       in_dev_put(in_dev);
+                                       goto found;
+                               }
+                       }
+                       in_dev_put(in_dev);
                }
-       }
+found:
        read_unlock(&dev_base_lock);
 
        return dev;
diff --git 
a/kernel_addons/backport/2.6.16_sles10_sp2/include/linux/inetdevice.h 
b/kernel_addons/backport/2.6.16_sles10_sp2/include/linux/inetdevice.h
index 4ef1826..c2fefbc 100644
--- a/kernel_addons/backport/2.6.16_sles10_sp2/include/linux/inetdevice.h
+++ b/kernel_addons/backport/2.6.16_sles10_sp2/include/linux/inetdevice.h
@@ -7,16 +7,24 @@
 static inline struct net_device *xxx_ip_dev_find(u32 addr)
 {
        struct net_device *dev;
-       u32 ip;
+       struct in_ifaddr **ifap;
+       struct in_ifaddr *ifa;
+       struct in_device *in_dev;
 
        read_lock(&dev_base_lock);
-       for (dev = dev_base; dev; dev = dev->next) {
-               ip = inet_select_addr(dev, 0, RT_SCOPE_HOST);
-               if (ip == addr) {
-                       dev_hold(dev);
-                       break;
+       for (dev = dev_base; dev; dev = dev->next)
+               if ((in_dev = in_dev_get(dev))) {
+                       for (ifap = &in_dev->ifa_list; (ifa = *ifap);
+                            ifap = &ifa->ifa_next) {
+                               if (addr == ifa->ifa_address) {
+                                       dev_hold(dev);
+                                       in_dev_put(in_dev);
+                                       goto found;
+                               }
+                       }
+                       in_dev_put(in_dev);
                }
-       }
+found:
        read_unlock(&dev_base_lock);
 
        return dev;
diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/inetdevice.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/inetdevice.h
index b50002b..fa70310 100644
--- a/kernel_addons/backport/2.6.9_U4/include/linux/inetdevice.h
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/inetdevice.h
@@ -9,16 +9,24 @@
 static inline struct net_device *xxx_ip_dev_find(u32 addr)
 {
        struct net_device *dev;
-       u32 ip;
+       struct in_ifaddr **ifap;
+       struct in_ifaddr *ifa;
+       struct in_device *in_dev;
 
        read_lock(&dev_base_lock);
-       for (dev = dev_base; dev; dev = dev->next) {
-               ip = inet_select_addr(dev, 0, RT_SCOPE_HOST);
-               if (ip == addr) {
-                       dev_hold(dev);
-                       break;
+       for (dev = dev_base; dev; dev = dev->next)
+               if ((in_dev = in_dev_get(dev))) {
+                       for (ifap = &in_dev->ifa_list; (ifa = *ifap);
+                            ifap = &ifa->ifa_next) {
+                               if (addr == ifa->ifa_address) {
+                                       dev_hold(dev);
+                                       in_dev_put(in_dev);
+                                       goto found;
+                               }
+                       }
+                       in_dev_put(in_dev);
                }
-       }
+found:
        read_unlock(&dev_base_lock);
 
        return dev;
diff --git a/kernel_addons/backport/2.6.9_U5/include/linux/inetdevice.h 
b/kernel_addons/backport/2.6.9_U5/include/linux/inetdevice.h
index b50002b..fa70310 100644
--- a/kernel_addons/backport/2.6.9_U5/include/linux/inetdevice.h
+++ b/kernel_addons/backport/2.6.9_U5/include/linux/inetdevice.h
@@ -9,16 +9,24 @@
 static inline struct net_device *xxx_ip_dev_find(u32 addr)
 {
        struct net_device *dev;
-       u32 ip;
+       struct in_ifaddr **ifap;
+       struct in_ifaddr *ifa;
+       struct in_device *in_dev;
 
        read_lock(&dev_base_lock);
-       for (dev = dev_base; dev; dev = dev->next) {
-               ip = inet_select_addr(dev, 0, RT_SCOPE_HOST);
-               if (ip == addr) {
-                       dev_hold(dev);
-                       break;
+       for (dev = dev_base; dev; dev = dev->next)
+               if ((in_dev = in_dev_get(dev))) {
+                       for (ifap = &in_dev->ifa_list; (ifa = *ifap);
+                            ifap = &ifa->ifa_next) {
+                               if (addr == ifa->ifa_address) {
+                                       dev_hold(dev);
+                                       in_dev_put(in_dev);
+                                       goto found;
+                               }
+                       }
+                       in_dev_put(in_dev);
                }
-       }
+found:
        read_unlock(&dev_base_lock);
 
        return dev;
diff --git a/kernel_addons/backport/2.6.9_U6/include/linux/inetdevice.h 
b/kernel_addons/backport/2.6.9_U6/include/linux/inetdevice.h
index b50002b..fa70310 100644
--- a/kernel_addons/backport/2.6.9_U6/include/linux/inetdevice.h
+++ b/kernel_addons/backport/2.6.9_U6/include/linux/inetdevice.h
@@ -9,16 +9,24 @@
 static inline struct net_device *xxx_ip_dev_find(u32 addr)
 {
        struct net_device *dev;
-       u32 ip;
+       struct in_ifaddr **ifap;
+       struct in_ifaddr *ifa;
+       struct in_device *in_dev;
 
        read_lock(&dev_base_lock);
-       for (dev = dev_base; dev; dev = dev->next) {
-               ip = inet_select_addr(dev, 0, RT_SCOPE_HOST);
-               if (ip == addr) {
-                       dev_hold(dev);
-                       break;
+       for (dev = dev_base; dev; dev = dev->next)
+               if ((in_dev = in_dev_get(dev))) {
+                       for (ifap = &in_dev->ifa_list; (ifa = *ifap);
+                            ifap = &ifa->ifa_next) {
+                               if (addr == ifa->ifa_address) {
+                                       dev_hold(dev);
+                                       in_dev_put(in_dev);
+                                       goto found;
+                               }
+                       }
+                       in_dev_put(in_dev);
                }
-       }
+found:
        read_unlock(&dev_base_lock);
 
        return dev;
diff --git a/kernel_addons/backport/2.6.9_U7/include/linux/inetdevice.h 
b/kernel_addons/backport/2.6.9_U7/include/linux/inetdevice.h
index b50002b..fa70310 100644
--- a/kernel_addons/backport/2.6.9_U7/include/linux/inetdevice.h
+++ b/kernel_addons/backport/2.6.9_U7/include/linux/inetdevice.h
@@ -9,16 +9,24 @@
 static inline struct net_device *xxx_ip_dev_find(u32 addr)
 {
        struct net_device *dev;
-       u32 ip;
+       struct in_ifaddr **ifap;
+       struct in_ifaddr *ifa;
+       struct in_device *in_dev;
 
        read_lock(&dev_base_lock);
-       for (dev = dev_base; dev; dev = dev->next) {
-               ip = inet_select_addr(dev, 0, RT_SCOPE_HOST);
-               if (ip == addr) {
-                       dev_hold(dev);
-                       break;
+       for (dev = dev_base; dev; dev = dev->next)
+               if ((in_dev = in_dev_get(dev))) {
+                       for (ifap = &in_dev->ifa_list; (ifa = *ifap);
+                            ifap = &ifa->ifa_next) {
+                               if (addr == ifa->ifa_address) {
+                                       dev_hold(dev);
+                                       in_dev_put(in_dev);
+                                       goto found;
+                               }
+                       }
+                       in_dev_put(in_dev);
                }
-       }
+found:
        read_unlock(&dev_base_lock);
 
        return dev;
_______________________________________________
ewg mailing list
ewg@lists.openfabrics.org
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg

Reply via email to