free_netdev() should be called after rtnl_lock is released.
Failing to to so might trigger an BUG in free_netdev() which asserts
that the device state is NETREG_UNREGISTERED.
Signed-off-by: Yossi Etigin <[email protected]>
--
Index: b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
===================================================================
--- a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c 2009-03-10 18:21:47.000000000
+0200
+++ b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c 2009-03-30 20:18:29.000000000
+0300
@@ -147,7 +147,10 @@ register_failed:
ipoib_dev_cleanup(priv->dev);
device_init_failed:
+ mutex_unlock(&ppriv->vlan_mutex);
+ rtnl_unlock();
free_netdev(priv->dev);
+ return result;
err:
mutex_unlock(&ppriv->vlan_mutex);
@@ -158,7 +161,6 @@ err:
int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey)
{
struct ipoib_dev_priv *ppriv, *priv, *tpriv;
- int ret = -ENOENT;
if (!capable(CAP_NET_ADMIN))
return -EPERM;
@@ -172,14 +174,15 @@ int ipoib_vlan_delete(struct net_device
unregister_netdevice(priv->dev);
ipoib_dev_cleanup(priv->dev);
list_del(&priv->list);
- free_netdev(priv->dev);
- ret = 0;
- break;
+ mutex_unlock(&ppriv->vlan_mutex);
+ rtnl_unlock();
+ free_netdev(priv->dev);
+ return 0;
}
}
mutex_unlock(&ppriv->vlan_mutex);
rtnl_unlock();
- return ret;
+ return -ENOENT;
}
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general