IrDA: Calling ppp_unregister_channel() from process context
Subsystems (2)
PATCH 3/3 IrDA: Calling ppp_unregister_channel() from process context
We need to call ppp_unregister_channel() when IrNET disconnects, and this must be done from a process context.
Bug reported and patch tested by Guennadi Liakhovetski.
--- net/irda/irnet/irnet.h | 2 +- net/irda/irnet/irnet_irda.c | 34 +++++++++++++++++++++++++--------- 2 files changed, 26 insertions(+), 10 deletions(-)
net/irda/irnet/irnet.h +1 -1
@@ -419,7 +419,7 @@ typedef struct irnet_socketu32 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 */ unsigned long ttp_open;/* Set when IrTTP is ready */
net/irda/irnet/irnet_irda.c +25 -9
@@ -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.
@@ -499,6 +520,8 @@ 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 ); }
@@ -1134,15 +1157,8 @@ irnet_disconnect_indication(void * instance, {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 {
Signature · 8 lines
1.5.0.2 ------------------------------------------------------------------------- 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
A message that is not in the archive (sent off-list or not yet received): [email protected]
From: Samuel Ortiz <[email protected]>
Date: Sat, 17 Mar 2007 04:05:33 +0200
Quoted 6 lines
We need to call
ppp_unregister_channel()when IrNET disconnects, and this must be done from a process context.Bug reported and patch tested by Guennadi Liakhovetski.
Signed-off-by Samuel Ortiz <[email protected]>
Also applied, thanks Sam. I'll start working on the net-2.6.22 patches you sent now.
-------------------------------------------------------------------------
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