diff options
Diffstat (limited to 'drivers/net/xen-netback/xenbus.c')
| -rw-r--r-- | drivers/net/xen-netback/xenbus.c | 31 | 
1 files changed, 19 insertions, 12 deletions
| diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c index bb854f92f5a5..d2d7cd9145b1 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c @@ -492,24 +492,31 @@ static int backend_create_xenvif(struct backend_info *be)  static void backend_disconnect(struct backend_info *be)  { -	if (be->vif) { +	struct xenvif *vif = be->vif; + +	if (vif) {  		unsigned int queue_index; +		struct xenvif_queue *queues; -		xen_unregister_watchers(be->vif); +		xen_unregister_watchers(vif);  #ifdef CONFIG_DEBUG_FS -		xenvif_debugfs_delif(be->vif); +		xenvif_debugfs_delif(vif);  #endif /* CONFIG_DEBUG_FS */ -		xenvif_disconnect_data(be->vif); -		for (queue_index = 0; queue_index < be->vif->num_queues; ++queue_index) -			xenvif_deinit_queue(&be->vif->queues[queue_index]); +		xenvif_disconnect_data(vif); +		for (queue_index = 0; +		     queue_index < vif->num_queues; +		     ++queue_index) +			xenvif_deinit_queue(&vif->queues[queue_index]); + +		spin_lock(&vif->lock); +		queues = vif->queues; +		vif->num_queues = 0; +		vif->queues = NULL; +		spin_unlock(&vif->lock); -		spin_lock(&be->vif->lock); -		vfree(be->vif->queues); -		be->vif->num_queues = 0; -		be->vif->queues = NULL; -		spin_unlock(&be->vif->lock); +		vfree(queues); -		xenvif_disconnect_ctrl(be->vif); +		xenvif_disconnect_ctrl(vif);  	}  } |