aboutsummaryrefslogtreecommitdiff
path: root/net/irda/irnet/irnet_irda.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-22 19:34:09 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-22 19:34:09 -0700
commitd6e8823e7bf423c6850c68f716d2f5f693c97447 (patch)
treedafa7c94a3acbb432271ac6c80f2fc7256b2d887 /net/irda/irnet/irnet_irda.c
parentf64cd9de37bfd97c8d23a05a9f50759ff7195212 (diff)
parent848c29fd648e78fa87d0e399223826ce5dfc1b7a (diff)
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: [NETFILTER]: nat: avoid rerouting packets if only XFRM policy key changed [NETFILTER]: nf_conntrack_netlink: add missing dependency on NF_NAT [NET]: fix up misplaced inlines. [SCTP]: Correctly reset ssthresh when restarting association [BRIDGE]: Fix fdb RCU race [NET]: Fix fib_rules dump race [XFRM]: ipsecv6 needs a space when printing audit record. [X25] x25_forward_call(): fix NULL dereferences [SCTP]: Reset some transport and association variables on restart [SCTP]: Increment error counters on user requested HBs. [SCTP]: Clean up stale data during association restart [IrDA]: Calling ppp_unregister_channel() from process context [IrDA]: irttp_dup spin_lock initialisation [IrDA]: Delay needed when uploading firmware chunks
Diffstat (limited to 'net/irda/irnet/irnet_irda.c')
-rw-r--r--net/irda/irnet/irnet_irda.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/net/irda/irnet/irnet_irda.c b/net/irda/irnet/irnet_irda.c
index c378e668af0..a4f1439ffdd 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.
@@ -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
{