From mboxrd@z Thu Jan 1 00:00:00 1970 From: Haiyang Zhang Subject: [PATCH 05/10] staging: hv: re-order the code in netvsc_probe() Date: Thu, 1 Sep 2011 12:19:43 -0700 Message-ID: <1314904788-32746-6-git-send-email-haiyangz@microsoft.com> References: <1314904788-32746-1-git-send-email-haiyangz@microsoft.com> Return-path: In-Reply-To: <1314904788-32746-1-git-send-email-haiyangz@microsoft.com> Sender: linux-kernel-owner@vger.kernel.org To: haiyangz@microsoft.com, hjanssen@microsoft.com, kys@microsoft.com, gregkh@suse.de, linux-kernel@vger.kernel.org, devel@linuxdriverproject.org, virtualization@lists.osdl.org List-Id: virtualization@lists.linuxfoundation.org Re-order the code in netvsc_probe() to prevent a guest crash caused by packets possibly received from NetVSP before call to register_netdev(). Signed-off-by: Haiyang Zhang Signed-off-by: K. Y. Srinivasan --- drivers/staging/hv/netvsc_drv.c | 32 +++++++++++++++++--------------- 1 files changed, 17 insertions(+), 15 deletions(-) diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index e6513be..b49a08f 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -348,19 +348,6 @@ static int netvsc_probe(struct hv_device *dev) dev_set_drvdata(&dev->device, net); INIT_DELAYED_WORK(&net_device_ctx->dwork, netvsc_send_garp); - /* Notify the netvsc driver of the new device */ - device_info.ring_size = ring_size; - ret = rndis_filter_device_add(dev, &device_info); - if (ret != 0) { - free_netdev(net); - dev_set_drvdata(&dev->device, NULL); - return ret; - } - - netif_carrier_on(net); - - memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN); - net->netdev_ops = &device_ops; /* TODO: Add GSO and Checksum offload */ @@ -372,11 +359,26 @@ static int netvsc_probe(struct hv_device *dev) ret = register_netdev(net); if (ret != 0) { - /* Remove the device and release the resource */ - rndis_filter_device_remove(dev); + pr_err("Unable to register netdev.\n"); free_netdev(net); + goto out; } + /* Notify the netvsc driver of the new device */ + device_info.ring_size = ring_size; + ret = rndis_filter_device_add(dev, &device_info); + if (ret != 0) { + netdev_err(net, "unable to add netvsc device (ret %d)\n", ret); + unregister_netdev(net); + free_netdev(net); + dev_set_drvdata(&dev->device, NULL); + return ret; + } + memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN); + + netif_carrier_on(net); + +out: return ret; } -- 1.6.3.2