From 5c2a4168a6e67733d4ec545936e13742c72ff9f8 Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Thu, 24 Jan 2002 10:42:34 +0000 Subject: [PATCH] linux-unmask-signals-in-rxk-listener-at-shutdown-20020124 since the rxk listener gets "kill"d at shutdown we need to unmask to wake it up. this should probably be replaced but the logical way is evil, involves simulating a packet to the listener so it wakes up and notices it's time to die --- src/afs/LINUX/osi_misc.c | 20 ++++++++++++++++++++ src/afs/afs_call.c | 6 ++++++ src/afs/afs_osi.c | 19 +++++++++++++++---- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/afs/LINUX/osi_misc.c b/src/afs/LINUX/osi_misc.c index ec345b31a..0e6df7bda 100644 --- a/src/afs/LINUX/osi_misc.c +++ b/src/afs/LINUX/osi_misc.c @@ -427,3 +427,23 @@ void check_bad_parent(struct dentry *dp) return; } + +struct task_struct *rxk_ListenerTask; + +void osi_linux_mask() { + spin_lock_irq(¤t->sigmask_lock); + sigfillset(¤t->blocked); + recalc_sigpending(current); + spin_unlock_irq(¤t->sigmask_lock); +} + +void osi_linux_unmask() { + spin_lock_irq(&rxk_ListenerTask->sigmask_lock); + sigemptyset(&rxk_ListenerTask->blocked); + recalc_sigpending(rxk_ListenerTask); + spin_unlock_irq(&rxk_ListenerTask->sigmask_lock); +} + +void osi_linux_rxkreg() { + rxk_ListenerTask = current; +} diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index 0d2c05ea4..7e538774e 100644 --- a/src/afs/afs_call.c +++ b/src/afs/afs_call.c @@ -191,6 +191,9 @@ long parm, parm2, parm3, parm4, parm5, parm6; afs_osi_Invisible(); afs_RX_Running = 2; afs_osi_Wakeup(&afs_RX_Running); +#ifndef UKERNEL + afs_osi_RxkRegister(); +#endif rxk_Listener(); } #ifdef AFS_SGI_ENV @@ -1257,6 +1260,9 @@ afs_shutdown() afs_osi_Sleep(&afs_termState); #if defined(RXK_LISTENER_ENV) afs_warn("RxListener... "); +#ifndef UKERNEL + afs_osi_UnmaskRxkSignals(); +#endif /* cancel rx listener */ osi_StopListener(); /* This closes rx_socket. */ while (afs_termState == AFSOP_STOP_RXK_LISTENER) diff --git a/src/afs/afs_osi.c b/src/afs/afs_osi.c index bd762eafb..ac3f65d92 100644 --- a/src/afs/afs_osi.c +++ b/src/afs/afs_osi.c @@ -283,13 +283,24 @@ afs_gfs_FlushText(vp) /* mask signals in afsds */ void afs_osi_MaskSignals(){ #ifdef AFS_LINUX22_ENV - spin_lock_irq(¤t->sigmask_lock); - sigfillset(¤t->blocked); - recalc_sigpending(current); - spin_unlock_irq(¤t->sigmask_lock); + osi_linux_mask(); #endif } +/* unmask signals in rxk listener */ +void afs_osi_UnmaskRxkSignals(){ +#ifdef AFS_LINUX22_ENV + osi_linux_unmask(); +#endif +} + +/* register rxk listener proc info */ +void afs_osi_RxkRegister(){ +#ifdef AFS_LINUX22_ENV + osi_linux_rxkreg(); +#endif +} + /* procedure for making our processes as invisible as we can */ void afs_osi_Invisible() { #ifdef AFS_LINUX22_ENV -- 2.39.5