[PATCH 2/6] IrDA: Process context ppp_unregister_channel() call
From: Samuel Ortiz <hidden>
Date: 2007-03-14 19:23:01
Subsystem:
networking [general], the rest · Maintainers:
"David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
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 stable-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org though ? Patch tested by Guennadi Liakhovetski. Reported-by: Guennadi Liakhovetski <gl-o/hVf8ie6tKzQB+pC5nmwQ@public.gmane.org> Signed-off-by: Samuel Ortiz <redacted> --- net/irda/irnet/irnet.h | 1 + net/irda/irnet/irnet_irda.c | 37 +++++++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/net/irda/irnet/irnet.h b/net/irda/irnet/irnet.h
index 44b58a6..ec1a2a8 100644
--- a/net/irda/irnet/irnet.h
+++ b/net/irda/irnet/irnet.h@@ -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 */
diff --git a/net/irda/irnet/irnet_irda.c b/net/irda/irnet/irnet_irda.c
index 843b767..0f462a9 100644
--- a/net/irda/irnet/irnet_irda.c
+++ b/net/irda/irnet/irnet_irda.c@@ -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)
--
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