RDMA/netdev: Fix netlink support in IPoIB
[sfrench/cifs-2.6.git] / drivers / infiniband / ulp / ipoib / ipoib_netlink.c
index d4d553a51fa98373802be96196c5f6fc6a574e7f..38c984d16996dda97e2bbce29a699e640e499b37 100644 (file)
@@ -122,12 +122,26 @@ static int ipoib_new_child_link(struct net *src_net, struct net_device *dev,
        } else
                child_pkey  = nla_get_u16(data[IFLA_IPOIB_PKEY]);
 
+       err = ipoib_intf_init(ppriv->ca, ppriv->port, dev->name, dev);
+       if (err) {
+               ipoib_warn(ppriv, "failed to initialize pkey device\n");
+               return err;
+       }
+
        err = __ipoib_vlan_add(ppriv, ipoib_priv(dev),
                               child_pkey, IPOIB_RTNL_CHILD);
+       if (err)
+               return err;
 
-       if (!err && data)
+       if (data) {
                err = ipoib_changelink(dev, tb, data, extack);
-       return err;
+               if (err) {
+                       unregister_netdevice(dev);
+                       return err;
+               }
+       }
+
+       return 0;
 }
 
 static size_t ipoib_get_size(const struct net_device *dev)
@@ -149,6 +163,11 @@ static struct rtnl_link_ops ipoib_link_ops __read_mostly = {
        .fill_info      = ipoib_fill_info,
 };
 
+struct rtnl_link_ops *ipoib_get_link_ops(void)
+{
+       return &ipoib_link_ops;
+}
+
 int __init ipoib_netlink_init(void)
 {
        return rtnl_link_register(&ipoib_link_ops);