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