ir241_lmp_timer_race-2.diff
PATCH 1/1 ir241_lmp_timer_race-2.diff
ir241_lmp_timer_race-2.diff :
o [CORRECT] Start timer before sending event to fix race condition
o [FEATURE] Improve the IrLMP event debugging messages.
net/irda/irlmp_event.c renamed from net/irda/irlmp_event.d3.c +16 -16
@@ -515,10 +515,10 @@ static int irlmp_state_disconnected(struirlmp_next_lsap_state (self,LSAP_SETUP_PEND ); -irlmp_do_lap_event (self->lap,LM_LAP_CONNECT_REQUEST ,NULL ); -/* Start watchdog timer (5 secs for now) */ irlmp_start_watchdog_timer (self,5 *HZ ); + +irlmp_do_lap_event (self->lap,LM_LAP_CONNECT_REQUEST ,NULL );break ;case LM_CONNECT_INDICATION :if (self->conn_skb) {
@@ -529,8 +529,6 @@ static int irlmp_state_disconnected(struirlmp_next_lsap_state (self,LSAP_CONNECT_PEND ); -irlmp_do_lap_event (self->lap,LM_LAP_CONNECT_REQUEST ,NULL ); -/* Start watchdog timer * This is not mentionned in the spec, but there is a rare * race condition that can get the socket stuck.
@@ -543,10 +541,12 @@ static int irlmp_state_disconnected(stru* a backup plan. 1 second is plenty (should be immediate). * Jean II */ irlmp_start_watchdog_timer (self,1 *HZ ); + +irlmp_do_lap_event (self->lap,LM_LAP_CONNECT_REQUEST ,NULL );break ;default : -IRDA_DEBUG (2 ,"%s(), Unknown event %s\n" , - __FUNCTION__, irlmp_event[event]); +IRDA_DEBUG (1 ,"%s(), Unknown event %s on LSAP %#02x\n" , + __FUNCTION__, irlmp_event[event], self->slsap_sel);if (skb)dev_kfree_skb (skb);break ;
@@ -604,8 +604,8 @@ static int irlmp_state_connect(struct lsirlmp_next_lsap_state (self,LSAP_DISCONNECTED );break ;default : -IRDA_DEBUG (0 ,"%s(), Unknown event %s\n" , - __FUNCTION__, irlmp_event[event]); +IRDA_DEBUG (0 ,"%s(), Unknown event %s on LSAP %#02x\n" , + __FUNCTION__, irlmp_event[event], self->slsap_sel);if (skb)dev_kfree_skb (skb);break ;
@@ -666,8 +666,8 @@ static int irlmp_state_connect_pend(struirlmp_next_lsap_state (self,LSAP_DISCONNECTED );break ;default : -IRDA_DEBUG (0 ,"%s() Unknown event %s\n" , - __FUNCTION__, irlmp_event[event]); +IRDA_DEBUG (0 ,"%s(), Unknown event %s on LSAP %#02x\n" , + __FUNCTION__, irlmp_event[event], self->slsap_sel);if (skb)dev_kfree_skb (skb);break ;
@@ -756,8 +756,8 @@ static int irlmp_state_dtr(struct lsap_cirlmp_disconnect_indication (self, reason, skb);break ;default : -IRDA_DEBUG (0 ,"%s(), Unknown event %s\n" , - __FUNCTION__, irlmp_event[event]); +IRDA_DEBUG (0 ,"%s(), Unknown event %s on LSAP %#02x\n" , + __FUNCTION__, irlmp_event[event], self->slsap_sel);if (skb)dev_kfree_skb (skb);break ;
@@ -829,8 +829,8 @@ static int irlmp_state_setup(struct lsapirlmp_disconnect_indication (self,LM_CONNECT_FAILURE ,NULL );break ;default : -IRDA_DEBUG (0 ,"%s(), Unknown event %s\n" , - __FUNCTION__, irlmp_event[event]); +IRDA_DEBUG (0 ,"%s(), Unknown event %s on LSAP %#02x\n" , + __FUNCTION__, irlmp_event[event], self->slsap_sel);if (skb)dev_kfree_skb (skb);break ;
@@ -888,8 +888,8 @@ static int irlmp_state_setup_pend(structirlmp_disconnect_indication (self, reason,NULL );break ;default : -IRDA_DEBUG (0 ,"%s(), Unknown event %s\n" , - __FUNCTION__, irlmp_event[event]); +IRDA_DEBUG (0 ,"%s(), Unknown event %s on LSAP %#02x\n" , + __FUNCTION__, irlmp_event[event], self->slsap_sel);if (skb)dev_kfree_skb (skb);break ;