aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/xen-netback/xenbus.c31
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)
492 492
493static void backend_disconnect(struct backend_info *be) 493static void backend_disconnect(struct backend_info *be)
494{ 494{
495 if (be->vif) { 495 struct xenvif *vif = be->vif;
496
497 if (vif) {
496 unsigned int queue_index; 498 unsigned int queue_index;
499 struct xenvif_queue *queues;
497 500
498 xen_unregister_watchers(be->vif); 501 xen_unregister_watchers(vif);
499#ifdef CONFIG_DEBUG_FS 502#ifdef CONFIG_DEBUG_FS
500 xenvif_debugfs_delif(be->vif); 503 xenvif_debugfs_delif(vif);
501#endif /* CONFIG_DEBUG_FS */ 504#endif /* CONFIG_DEBUG_FS */
502 xenvif_disconnect_data(be->vif); 505 xenvif_disconnect_data(vif);
503 for (queue_index = 0; queue_index < be->vif->num_queues; ++queue_index) 506 for (queue_index = 0;
504 xenvif_deinit_queue(&be->vif->queues[queue_index]); 507 queue_index < vif->num_queues;
508 ++queue_index)
509 xenvif_deinit_queue(&vif->queues[queue_index]);
510
511 spin_lock(&vif->lock);
512 queues = vif->queues;
513 vif->num_queues = 0;
514 vif->queues = NULL;
515 spin_unlock(&vif->lock);
505 516
506 spin_lock(&be->vif->lock); 517 vfree(queues);
507 vfree(be->vif->queues);
508 be->vif->num_queues = 0;
509 be->vif->queues = NULL;
510 spin_unlock(&be->vif->lock);
511 518
512 xenvif_disconnect_ctrl(be->vif); 519 xenvif_disconnect_ctrl(vif);
513 } 520 }
514} 521}
515 522