From 7a40cd2c83d174ae0bb7e22d62fad9fbd247a654 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 7 Jan 2019 14:25:57 -0500 Subject: [PATCH] LU-11838 o2iblnd: get IP address more directly. Use dev_get_by_name() and for_primary_ifa() to get IP address for a named device. This is more direct. Linux-commit: 10e138e41a4343fd1a88e4543990205d134e562a Linux-commit: 9eb957b98aa6322abde33240bf50dd483c5d1190 Change-Id: Ic4562c3948934bacb8613e9f6f57f609ecc04de7 Signed-off-by: NeilBrown Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/33970 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Sonia Sharma Reviewed-by: Doug Oucharek Reviewed-by: Oleg Drokin --- lnet/klnds/o2iblnd/o2iblnd.c | 78 +++++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/lnet/klnds/o2iblnd/o2iblnd.c b/lnet/klnds/o2iblnd/o2iblnd.c index 98818ed..c3aaea7 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.c +++ b/lnet/klnds/o2iblnd/o2iblnd.c @@ -35,6 +35,8 @@ */ #include +#include + #include "o2iblnd.h" static struct lnet_lnd the_o2iblnd; @@ -2866,42 +2868,56 @@ kiblnd_destroy_dev(struct kib_dev *dev) static struct kib_dev * kiblnd_create_dev(char *ifname) { - struct net_device *netdev; + struct net_device *netdev; + struct in_device *in_dev; struct kib_dev *dev; - __u32 netmask; - __u32 ip; - int up; - int rc; + int flags; + int rc; - rc = lnet_ipif_query(ifname, &up, &ip, &netmask); - if (rc != 0) { - CERROR("Can't query IPoIB interface %s: %d\n", - ifname, rc); - return NULL; - } + rtnl_lock(); + netdev = dev_get_by_name(&init_net, ifname); + if (!netdev) { + CERROR("Can't find IPoIB interface %s\n", + ifname); + goto unlock; + } - if (!up) { - CERROR("Can't query IPoIB interface %s: it's down\n", ifname); - return NULL; - } + flags = dev_get_flags(netdev); + if (!(flags & IFF_UP)) { + CERROR("Can't query IPoIB interface %s: it's down\n", ifname); + goto unlock; + } - LIBCFS_ALLOC(dev, sizeof(*dev)); - if (dev == NULL) - return NULL; + LIBCFS_ALLOC(dev, sizeof(*dev)); + if (!dev) + goto unlock; - netdev = dev_get_by_name(&init_net, ifname); - if (netdev == NULL) { - dev->ibd_can_failover = 0; - } else { - dev->ibd_can_failover = !!(netdev->flags & IFF_MASTER); - dev_put(netdev); - } + dev->ibd_can_failover = !!(flags & IFF_MASTER); INIT_LIST_HEAD(&dev->ibd_nets); INIT_LIST_HEAD(&dev->ibd_list); /* not yet in kib_devs */ INIT_LIST_HEAD(&dev->ibd_fail_list); - dev->ibd_ifip = ip; - strcpy(&dev->ibd_ifname[0], ifname); + + in_dev = __in_dev_get_rtnl(netdev); + if (!in_dev) { + kfree(dev); + goto unlock; + } + + for_primary_ifa(in_dev) + if (strcmp(ifa->ifa_label, ifname) == 0) { + dev->ibd_ifip = ntohl(ifa->ifa_local); + break; + } + endfor_ifa(in_dev); + rtnl_unlock(); + + if (dev->ibd_ifip == 0) { + CERROR("Can't initialize device: no IP address\n"); + LIBCFS_FREE(dev, sizeof(*dev)); + return NULL; + } + strcpy(&dev->ibd_ifname[0], ifname); /* initialize the device */ rc = kiblnd_dev_failover(dev); @@ -2911,9 +2927,11 @@ kiblnd_create_dev(char *ifname) return NULL; } - list_add_tail(&dev->ibd_list, - &kiblnd_data.kib_devs); - return dev; + list_add_tail(&dev->ibd_list, &kiblnd_data.kib_devs); + return dev; +unlock: + rtnl_unlock(); + return NULL; } static void -- 1.8.3.1