Ensure remove works properly if plugin hasn't called netfront_accelerator_ready diff -r fced90d566f1 drivers/xen/netfront/accel.c --- a/drivers/xen/netfront/accel.c Sat Nov 10 10:18:28 2007 +0000 +++ b/drivers/xen/netfront/accel.c Thu Nov 22 10:14:11 2007 +0000 @@ -465,15 +465,18 @@ static void accelerator_remove_hooks(str link) { spin_lock_irqsave(&accelerator->vif_states_lock, flags); - BUG_ON(vif_state->hooks == NULL); - hooks = vif_state->hooks; - accelerator_remove_single_hook(accelerator, vif_state); + if(vif_state->hooks) { + hooks = vif_state->hooks; + accelerator_remove_single_hook(accelerator, vif_state); + + /* Last chance to get statistics from the accelerator */ + hooks->get_stats(vif_state->np->netdev, + &vif_state->np->stats); + } spin_unlock_irqrestore(&accelerator->vif_states_lock, flags); - /* Last chance to get statistics from the accelerator */ - hooks->get_stats(vif_state->np->netdev, &vif_state->np->stats); - hooks->remove(vif_state->dev); + accelerator->hooks->remove(vif_state->dev); } accelerator->hooks = NULL; @@ -530,15 +533,16 @@ static int do_remove(struct netfront_inf /* Last chance to get statistics from the accelerator */ hooks->get_stats(np->netdev, &np->stats); - + } + + if (accelerator->hooks) { spin_unlock_irqrestore(&accelerator->vif_states_lock, *lock_flags); - rc = hooks->remove(dev); + rc = accelerator->hooks->remove(dev); spin_lock_irqsave(&accelerator->vif_states_lock, *lock_flags); } - return rc; }