Whamcloud - gitweb
LU-11838 o2iblnd: get IP address more directly. 70/33970/4
authorNeilBrown <neilb@suse.com>
Mon, 7 Jan 2019 19:25:57 +0000 (14:25 -0500)
committerOleg Drokin <green@whamcloud.com>
Wed, 30 Jan 2019 02:41:08 +0000 (02:41 +0000)
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 <neilb@suse.com>
Signed-off-by: James Simmons <jsimmons@infradead.org>
Reviewed-on: https://review.whamcloud.com/33970
Tested-by: Jenkins
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Sonia Sharma <sharmaso@whamcloud.com>
Reviewed-by: Doug Oucharek <dougso@me.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lnet/klnds/o2iblnd/o2iblnd.c

index 98818ed..c3aaea7 100644 (file)
@@ -35,6 +35,8 @@
  */
 
 #include <asm/page.h>
+#include <linux/inetdevice.h>
+
 #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