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>
+#include <linux/inetdevice.h>
+
#include "o2iblnd.h"
static struct lnet_lnd the_o2iblnd;
#include "o2iblnd.h"
static struct lnet_lnd the_o2iblnd;
static struct kib_dev *
kiblnd_create_dev(char *ifname)
{
static struct kib_dev *
kiblnd_create_dev(char *ifname)
{
- struct net_device *netdev;
+ struct net_device *netdev;
+ struct in_device *in_dev;
- __u32 netmask;
- __u32 ip;
- int up;
- 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);
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);
/* initialize the device */
rc = kiblnd_dev_failover(dev);
- 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;