DEVEL15-solaris10-cleanup-friendliness-20080130
authorDerrick Brashear <shadow@dementia.org>
Thu, 31 Jan 2008 20:18:36 +0000 (20:18 +0000)
committerDerrick Brashear <shadow@dementia.org>
Thu, 31 Jan 2008 20:18:36 +0000 (20:18 +0000)
LICENSE IPL10

based on patch from mib@unimelb.edu.au

clean up taskq after ourselves and don't leave ourself marked system processes

(cherry picked from commit 462f1fb90defcb351657655442024f971705d945)

src/afs/UKERNEL/afs_usrops.c
src/afs/afs_call.c
src/afs/afs_osi.c
src/afs/afs_prototypes.h
src/config/afs_args.h
src/rx/SOLARIS/rx_knet.c
src/rx/rx_kcommon.c

index 094c141..d4cae72 100644 (file)
@@ -1004,6 +1004,12 @@ afs_osi_Invisible(void)
     return;
 }
 
+void
+afs_osi_Visible(void)
+{
+    return;
+}
+
 int
 osi_GetTime(struct timeval *tv)
 {
index e8edf2b..4246bac 100644 (file)
@@ -540,6 +540,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
 #endif /* RXK_LISTENER_ENV */
            afs_osi_Invisible();
            afs_RXCallBackServer();
+           afs_osi_Visible();
        }
 #ifdef AFS_SGI_ENV
        AFS_GUNLOCK();
@@ -568,6 +569,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
            afs_osi_RxkRegister();
 #endif /* !UKERNEL */
            rxk_Listener();
+           afs_osi_Visible();
        }
 #ifdef AFS_SGI_ENV
        AFS_GUNLOCK();
@@ -587,6 +589,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
        afs_osi_Wakeup(&afs_initState);
        afs_osi_Invisible();
        afs_Daemon();
+       afs_osi_Visible();
 #ifdef AFS_SGI_ENV
        AFS_GUNLOCK();
        exit(CLD_EXITED, 0);
@@ -594,6 +597,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
     } else if (parm == AFSOP_START_CS) {
        afs_osi_Invisible();
        afs_CheckServerDaemon();
+       afs_osi_Visible();
 #ifdef AFS_SGI_ENV
        AFS_GUNLOCK();
        exit(CLD_EXITED, 0);
@@ -613,6 +617,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
        else
 #endif /* AFS_AIX32_ENV */
            afs_BackgroundDaemon();
+       afs_osi_Visible();
 #ifdef AFS_SGI_ENV
        AFS_GUNLOCK();
        exit(CLD_EXITED, 0);
@@ -623,6 +628,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
        /* start the bkg daemon */
        afs_osi_Invisible();
        afs_CacheTruncateDaemon();
+       afs_osi_Visible();
 #ifdef AFS_SGI_ENV
        AFS_GUNLOCK();
        exit(CLD_EXITED, 0);
@@ -634,6 +640,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
            afs_osi_Sleep(&afs_initState);
        afs_osi_Invisible();
        afs_rxevent_daemon();
+       afs_osi_Visible();
 #ifdef AFS_SGI_ENV
        AFS_GUNLOCK();
        exit(CLD_EXITED, 0);
index f469939..e459f8b 100644 (file)
@@ -205,6 +205,19 @@ afs_osi_Invisible(void)
     AFS_STATCNT(osi_Invisible);
 }
 
+void
+afs_osi_Visible(void)
+{
+#if defined(AFS_SUN5_ENV)
+    curproc->p_flag &= ~SSYS;
+#elif defined(AFS_DARWIN80_ENV)
+#elif defined(AFS_DARWIN_ENV)
+    /* maybe call init_process instead? */
+    current_proc()->p_flag &= ~P_SYSTEM;
+#elif defined(AFS_XBSD_ENV)
+    curproc->p_flag &= ~P_SYSTEM;
+#endif
+}
 
 #if !defined(AFS_LINUX20_ENV) && !defined(AFS_FBSD_ENV)
 /* set the real time */
index 2903616..c0731b3 100644 (file)
@@ -499,6 +499,7 @@ extern void shutdown_nfsclnt(void);
 /* afs_osi.c */
 extern afs_lock_t afs_ftf;
 extern void afs_osi_Invisible(void);
+extern void afs_osi_Visible(void);
 extern void afs_osi_RxkRegister(void);
 extern void afs_osi_MaskSignals(void);
 extern void afs_osi_UnmaskRxkSignals(void);
index 7e362e7..2db7d34 100644 (file)
 /* #define AFSOP_STOP_COMPLETE     215  defined in osi.h             */
 /* #define AFSOP_STOP_RXK_LISTENER   217     defined in osi.h        */
 #define AFSOP_STOP_AFSDB       218     /* Stop AFSDB handler */
+#define AFSOP_STOP_NETIF        219     /* Stop Netif poller */
 
 /* Main afs syscall entry; this number may vary per system (i.e. defined in afs/param.h) */
 #ifndef        AFS_SYSCALL
index c46f09b..6246fe1 100644 (file)
@@ -592,6 +592,14 @@ osi_NetIfPoller()
     uint_t mtu;
     uint64_t flags;
 
+    if (afs_termState == AFSOP_STOP_NETIF) {
+       afs_warn("NetIfPoller... ");
+       rw_destroy(&afsifinfo_lock);
+       ddi_taskq_destroy(afs_taskq);
+       afs_termState = AFSOP_STOP_COMPLETE;
+       osi_rxWakeup(&afs_termState);
+       return;
+    }
     /* Get our permissions */
     cr = CRED();
 
index 70ac504..044c96f 100644 (file)
@@ -1089,8 +1089,12 @@ afs_rxevent_daemon(void)
 #ifdef RXK_LISTENER_ENV
            afs_termState = AFSOP_STOP_RXK_LISTENER;
 #else
+#ifdef AFS_SUN510_ENV
+           afs_termState = AFSOP_STOP_NETIF;
+#else
            afs_termState = AFSOP_STOP_COMPLETE;
 #endif
+#endif
            osi_rxWakeup(&afs_termState);
            return;
        }
@@ -1267,7 +1271,11 @@ rxk_Listener(void)
     AFS_GLOCK();
 #endif /* RX_ENABLE_LOCKS */
     if (afs_termState == AFSOP_STOP_RXK_LISTENER) {
+#ifdef AFS_SUN510_ENV
+       afs_termState = AFSOP_STOP_NETIF;
+#else
        afs_termState = AFSOP_STOP_COMPLETE;
+#endif
        osi_rxWakeup(&afs_termState);
     }
     rxk_ListenerPid = 0;