IrDA: Process context ppp_unregister_channel() call
Subsystems (2)
PATCH 2/6 IrDA: Process context ppp_unregister_channel() call
We need to call ppp_unregister_channel() when IrNET disconnects, and this must be done from a process context.
This patch applies on top of "[PATCH 1/7] IrDA: IrNET code indentation". Also, this is a bug fix, certainly not a critical one. Should I forward it to [email protected] though ?
Patch tested by Guennadi Liakhovetski.
Reported-by Guennadi Liakhovetski <gl-o/[email protected]>
Signed-off-by Samuel Ortiz <[email protected]>
--- net/irda/irnet/irnet.h | 1 + net/irda/irnet/irnet_irda.c | 37 +++++++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 12 deletions(-)
net/irda/irnet/irnet.h +1 -0
@@ -418,6 +418,7 @@ typedef struct irnet_socket {u32 raccm;/* to please pppd - dummy) */ unsigned int flags;/* PPP flags (compression, ...) */ unsigned int rbits;/* Unused receive flags ??? */ +struct work_struct disconnect_work;/* Process context disconnection */ /* ------------------------ IrTTP part ------------------------ */ /* We create a pseudo "socket" over the IrDA tranport */
net/irda/irnet/irnet_irda.c +25 -12
@@ -10,6 +10,27 @@#include "irnet_irda.h" /* Private header */ +/* +* PPP disconnect work: we need to make sure we're in +* process context when calling ppp_unregister_channel(). +*/ +static void irnet_ppp_disconnect (struct work_struct *work) +{ +irnet_socket * self = +container_of (work, irnet_socket, disconnect_work); + +if (self ==NULL ) +return ; +/* +* If we were connected, cleanup & close the PPP +* channel, which will kill pppd (hangup) and the rest. +*/ +if (self->ppp_open && !self->ttp_open && !self->ttp_connect) { +ppp_unregister_channel (&self->chan); + self->ppp_open =0 ; + } +} +/************************* CONTROL CHANNEL *************************/ /* * When ppp is not active, /dev/irnet act as a control channel.
@@ -487,6 +508,8 @@ int irda_irnet_create(irnet_socket * self)#endif /* DISCOVERY_NOMASK */ self->tx_flow =FLOW_START ;/* Flow control from IrTTP */ +INIT_WORK (&self->disconnect_work, irnet_ppp_disconnect); +DEXIT (IRDA_SOCK_TRACE ,"\n" );return (0 ); }
@@ -1123,18 +1146,8 @@ irnet_disconnect_indication(void *instance,/* Deal with the ppp instance if it's still alive */ if (self->ppp_open) {if (test_open) { -#ifdef MISSING_PPP_API -/* -* ppp_unregister_channel() wants a user context, -* which we are guaranteed to NOT have here. -* What are we supposed to do here ? Jean II */ -/* -* If we were connected, cleanup & close the PPP -* channel, which will kill pppd (hangup) and the rest. -*/ -ppp_unregister_channel (&self->chan); - self->ppp_open =0 ; -#endif +/* ppp_unregister_channel() wants a user context. */ +schedule_work (&self->disconnect_work); }else {/* * If we were trying to connect, flush (drain)
Signature · 8 lines
1.4.4.4 ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV