Whamcloud - gitweb
LU-537 o2iblnd: support aliased interface
authorLiang Zhen <liang@whamcloud.com>
Wed, 27 Jul 2011 04:47:57 +0000 (12:47 +0800)
committerOleg Drokin <green@whamcloud.com>
Wed, 14 Dec 2011 20:11:35 +0000 (15:11 -0500)
Current kiblnd_create_dev() doesn't allow to dev_get_by_name() to
return NULL (we added this for supporting failover of ib-bonding),
but this can happen for aliased interface, we can fix this by simply
remove the limitation and set kib_dev_t::ibd_can_failover to 0 for
aliased interface.

Change-Id: Idc3e6e4fd2d5056594f38dd43a0a560c3455ea05
Signed-off-by: Liang Zhen <liang@whamcloud.com>
Reviewed-on: http://review.whamcloud.com/1148
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Minh Diep <mdiep@whamcloud.com>
Reviewed-by: Lai Siyao <laisiyao@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lnet/klnds/o2iblnd/o2iblnd.c
lnet/klnds/o2iblnd/o2iblnd.h

index 190d90e..7324c94 100644 (file)
@@ -2588,18 +2588,17 @@ kiblnd_create_dev(char *ifname)
 
         memset(dev, 0, sizeof(*dev));
 #ifdef HAVE_DEV_GET_BY_NAME_2ARG
 
         memset(dev, 0, sizeof(*dev));
 #ifdef HAVE_DEV_GET_BY_NAME_2ARG
-        if ((netdev = dev_get_by_name(&init_net, ifname)) == NULL) {
+        netdev = dev_get_by_name(&init_net, ifname);
 #else
 #else
-        if ((netdev = dev_get_by_name(ifname)) == NULL) {
+        netdev = dev_get_by_name(ifname);
 #endif
 #endif
-                CERROR("Can't find netdev of IF: %s\n", ifname);
-                LIBCFS_FREE(dev, sizeof(*dev));
-                return NULL;
+        if (netdev == NULL) {
+                dev->ibd_can_failover = 0;
+        } else {
+                dev->ibd_can_failover = !!(netdev->flags & IFF_MASTER);
+                dev_put(netdev);
         }
 
         }
 
-        dev->ibd_can_failover = !!(netdev->flags & IFF_MASTER);
-        dev_put(netdev);
-
         CFS_INIT_LIST_HEAD(&dev->ibd_nets);
         CFS_INIT_LIST_HEAD(&dev->ibd_list); /* not yet in kib_devs */
         CFS_INIT_LIST_HEAD(&dev->ibd_fail_list);
         CFS_INIT_LIST_HEAD(&dev->ibd_nets);
         CFS_INIT_LIST_HEAD(&dev->ibd_list); /* not yet in kib_devs */
         CFS_INIT_LIST_HEAD(&dev->ibd_fail_list);
index aa16854..332928a 100644 (file)
@@ -195,12 +195,20 @@ kiblnd_concurrent_sends_v1(void)
 
 struct kib_hca_dev;
 
 
 struct kib_hca_dev;
 
+/* o2iblnd can run over aliased interface */
+#ifdef IFALIASZ
+#define KIB_IFNAME_SIZE              IFALIASZ
+#else
+#define KIB_IFNAME_SIZE              256
+#endif
+
 typedef struct
 {
         cfs_list_t           ibd_list;          /* chain on kib_devs */
         cfs_list_t           ibd_fail_list;     /* chain on kib_failed_devs */
         __u32                ibd_ifip;          /* IPoIB interface IP */
 typedef struct
 {
         cfs_list_t           ibd_list;          /* chain on kib_devs */
         cfs_list_t           ibd_fail_list;     /* chain on kib_failed_devs */
         __u32                ibd_ifip;          /* IPoIB interface IP */
-        char                 ibd_ifname[32];    /* IPoIB interface name */
+        /** IPoIB interface name */
+        char                 ibd_ifname[KIB_IFNAME_SIZE];
         int                  ibd_nnets;         /* # nets extant */
 
         cfs_time_t           ibd_next_failover;
         int                  ibd_nnets;         /* # nets extant */
 
         cfs_time_t           ibd_next_failover;