Commit a68f9614 authored by Haiyang Zhang's avatar Haiyang Zhang Committed by David S. Miller

hyperv: Fix race between probe and open calls

Moving the register_netdev to the end of probe to prevent
possible open call happens before NetVSP is connected.
Signed-off-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 965cdea8
...@@ -261,9 +261,7 @@ int netvsc_recv_callback(struct hv_device *device_obj, ...@@ -261,9 +261,7 @@ int netvsc_recv_callback(struct hv_device *device_obj,
struct sk_buff *skb; struct sk_buff *skb;
net = ((struct netvsc_device *)hv_get_drvdata(device_obj))->ndev; net = ((struct netvsc_device *)hv_get_drvdata(device_obj))->ndev;
if (!net) { if (!net || net->reg_state != NETREG_REGISTERED) {
netdev_err(net, "got receive callback but net device"
" not initialized yet\n");
packet->status = NVSP_STAT_FAIL; packet->status = NVSP_STAT_FAIL;
return 0; return 0;
} }
...@@ -435,19 +433,11 @@ static int netvsc_probe(struct hv_device *dev, ...@@ -435,19 +433,11 @@ static int netvsc_probe(struct hv_device *dev,
SET_ETHTOOL_OPS(net, &ethtool_ops); SET_ETHTOOL_OPS(net, &ethtool_ops);
SET_NETDEV_DEV(net, &dev->device); SET_NETDEV_DEV(net, &dev->device);
ret = register_netdev(net);
if (ret != 0) {
pr_err("Unable to register netdev.\n");
free_netdev(net);
goto out;
}
/* Notify the netvsc driver of the new device */ /* Notify the netvsc driver of the new device */
device_info.ring_size = ring_size; device_info.ring_size = ring_size;
ret = rndis_filter_device_add(dev, &device_info); ret = rndis_filter_device_add(dev, &device_info);
if (ret != 0) { if (ret != 0) {
netdev_err(net, "unable to add netvsc device (ret %d)\n", ret); netdev_err(net, "unable to add netvsc device (ret %d)\n", ret);
unregister_netdev(net);
free_netdev(net); free_netdev(net);
hv_set_drvdata(dev, NULL); hv_set_drvdata(dev, NULL);
return ret; return ret;
...@@ -456,7 +446,13 @@ static int netvsc_probe(struct hv_device *dev, ...@@ -456,7 +446,13 @@ static int netvsc_probe(struct hv_device *dev,
netif_carrier_on(net); netif_carrier_on(net);
out: ret = register_netdev(net);
if (ret != 0) {
pr_err("Unable to register netdev.\n");
rndis_filter_device_remove(dev);
free_netdev(net);
}
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment