diff options
Diffstat (limited to 'net/802/mrp.c')
| -rw-r--r-- | net/802/mrp.c | 18 | 
1 files changed, 13 insertions, 5 deletions
| diff --git a/net/802/mrp.c b/net/802/mrp.c index 8c6f0381023b..66fcbf23b486 100644 --- a/net/802/mrp.c +++ b/net/802/mrp.c @@ -606,7 +606,10 @@ static void mrp_join_timer(struct timer_list *t)  	spin_unlock(&app->lock);  	mrp_queue_xmit(app); -	mrp_join_timer_arm(app); +	spin_lock(&app->lock); +	if (likely(app->active)) +		mrp_join_timer_arm(app); +	spin_unlock(&app->lock);  }  static void mrp_periodic_timer_arm(struct mrp_applicant *app) @@ -620,11 +623,12 @@ static void mrp_periodic_timer(struct timer_list *t)  	struct mrp_applicant *app = from_timer(app, t, periodic_timer);  	spin_lock(&app->lock); -	mrp_mad_event(app, MRP_EVENT_PERIODIC); -	mrp_pdu_queue(app); +	if (likely(app->active)) { +		mrp_mad_event(app, MRP_EVENT_PERIODIC); +		mrp_pdu_queue(app); +		mrp_periodic_timer_arm(app); +	}  	spin_unlock(&app->lock); - -	mrp_periodic_timer_arm(app);  }  static int mrp_pdu_parse_end_mark(struct sk_buff *skb, int *offset) @@ -872,6 +876,7 @@ int mrp_init_applicant(struct net_device *dev, struct mrp_application *appl)  	app->dev = dev;  	app->app = appl;  	app->mad = RB_ROOT; +	app->active = true;  	spin_lock_init(&app->lock);  	skb_queue_head_init(&app->queue);  	rcu_assign_pointer(dev->mrp_port->applicants[appl->type], app); @@ -900,6 +905,9 @@ void mrp_uninit_applicant(struct net_device *dev, struct mrp_application *appl)  	RCU_INIT_POINTER(port->applicants[appl->type], NULL); +	spin_lock_bh(&app->lock); +	app->active = false; +	spin_unlock_bh(&app->lock);  	/* Delete timer and generate a final TX event to flush out  	 * all pending messages before the applicant is gone.  	 */ | 
