lkml.org 
[lkml]   [2011]   [Jul]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5/9] staging: hv: re-order the code in netvsc_probe()
    Date
    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 <haiyangz@microsoft.com>
    Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
    ---
    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 c8e2f24..816e382 100644
    --- a/drivers/staging/hv/netvsc_drv.c
    +++ b/drivers/staging/hv/netvsc_drv.c
    @@ -350,19 +350,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 */
    @@ -374,11 +361,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


    \
     
     \ /
      Last update: 2011-07-21 19:39    [W:0.021 / U:31.132 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site