diff options
-rw-r--r-- | drivers/net/hyperv/netvsc_drv.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 2d3cdb026a99..bc05c895d958 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
@@ -859,15 +859,22 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu) | |||
859 | if (ret) | 859 | if (ret) |
860 | goto out; | 860 | goto out; |
861 | 861 | ||
862 | memset(&device_info, 0, sizeof(device_info)); | ||
863 | device_info.ring_size = ring_size; | ||
864 | device_info.num_chn = nvdev->num_chn; | ||
865 | device_info.max_num_vrss_chns = nvdev->num_chn; | ||
866 | |||
862 | ndevctx->start_remove = true; | 867 | ndevctx->start_remove = true; |
863 | rndis_filter_device_remove(hdev, nvdev); | 868 | rndis_filter_device_remove(hdev, nvdev); |
864 | 869 | ||
870 | /* 'nvdev' has been freed in rndis_filter_device_remove() -> | ||
871 | * netvsc_device_remove () -> free_netvsc_device(). | ||
872 | * We mustn't access it before it's re-created in | ||
873 | * rndis_filter_device_add() -> netvsc_device_add(). | ||
874 | */ | ||
875 | |||
865 | ndev->mtu = mtu; | 876 | ndev->mtu = mtu; |
866 | 877 | ||
867 | memset(&device_info, 0, sizeof(device_info)); | ||
868 | device_info.ring_size = ring_size; | ||
869 | device_info.num_chn = nvdev->num_chn; | ||
870 | device_info.max_num_vrss_chns = nvdev->num_chn; | ||
871 | rndis_filter_device_add(hdev, &device_info); | 878 | rndis_filter_device_add(hdev, &device_info); |
872 | 879 | ||
873 | out: | 880 | out: |