Move contents of afs_osi_gcpags to per-OS files
[openafs.git] / src / afs / LINUX / osi_gcpags.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #include "afs/param.h"
12
13
14 #include "afs/sysincludes.h"    /* Standard vendor system headers */
15 #include "afsincludes.h"        /* Afs-based standard headers */
16 #include "afs/afs_stats.h"      /* afs statistics */
17
18 #if AFS_GCPAGS
19
20 /* afs_osi_TraverseProcTable() - Walk through the systems process
21  * table, calling afs_GCPAGs_perproc_func() for each process.
22  */
23
24
25 #if defined(AFS_LINUX22_ENV)
26 #ifdef EXPORTED_TASKLIST_LOCK
27 extern rwlock_t tasklist_lock __attribute__((weak));
28 #endif
29 void
30 afs_osi_TraverseProcTable(void)
31 {
32 #if !defined(LINUX_KEYRING_SUPPORT) && (!defined(STRUCT_TASK_HAS_CRED) || defined(EXPORTED_RCU_READ_LOCK))
33     struct task_struct *p;
34
35 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) && defined(EXPORTED_TASKLIST_LOCK)
36     if (&tasklist_lock)
37         read_lock(&tasklist_lock);
38 #endif /* EXPORTED_TASKLIST_LOCK */
39 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
40 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) && defined(EXPORTED_TASKLIST_LOCK)
41     else
42 #endif /* EXPORTED_TASKLIST_LOCK && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) */
43         rcu_read_lock();
44 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) */
45
46 #ifdef DEFINED_FOR_EACH_PROCESS
47     for_each_process(p) if (p->pid) {
48 #ifdef STRUCT_TASK_STRUCT_HAS_EXIT_STATE
49         if (p->exit_state)
50             continue;
51 #else
52         if (p->state & TASK_ZOMBIE)
53             continue;
54 #endif
55         afs_GCPAGs_perproc_func(p);
56     }
57 #else
58     for_each_task(p) if (p->pid) {
59 #ifdef STRUCT_TASK_STRUCT_HAS_EXIT_STATE
60         if (p->exit_state)
61             continue;
62 #else
63         if (p->state & TASK_ZOMBIE)
64             continue;
65 #endif
66         afs_GCPAGs_perproc_func(p);
67     }
68 #endif
69 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) && defined(EXPORTED_TASKLIST_LOCK)
70     if (&tasklist_lock)
71         read_unlock(&tasklist_lock);
72 #endif /* EXPORTED_TASKLIST_LOCK */
73 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
74 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) && defined(EXPORTED_TASKLIST_LOCK)
75     else
76 #endif /* EXPORTED_TASKLIST_LOCK && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) */
77         rcu_read_unlock();
78 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) */
79 #endif
80 }
81
82 /* return a pointer (sometimes a static copy ) to the cred for a
83  * given afs_proc_t.
84  * subsequent calls may overwrite the previously returned value.
85  */
86
87 #if !defined(LINUX_KEYRING_SUPPORT) && (!defined(STRUCT_TASK_HAS_CRED) || defined(EXPORTED_RCU_READ_LOCK))
88 const afs_ucred_t *
89 afs_osi_proc2cred(afs_proc_t * pr)
90 {
91     afs_ucred_t *rv = NULL;
92     static afs_ucred_t cr;
93
94     if (pr == NULL) {
95         return NULL;
96     }
97
98     if ((pr->state == TASK_RUNNING) || (pr->state == TASK_INTERRUPTIBLE)
99         || (pr->state == TASK_UNINTERRUPTIBLE)
100         || (pr->state == TASK_STOPPED)) {
101         /* This is dangerous. If anyone ever crfree's the cred that's
102          * returned from here, we'll go boom, because it's statically
103          * allocated. */
104         atomic_set(&cr.cr_ref, 1);
105         afs_set_cr_uid(&cr, task_uid(pr));
106 #if defined(AFS_LINUX26_ENV)
107 #if defined(STRUCT_TASK_HAS_CRED)
108         get_group_info(pr->cred->group_info);
109         set_cr_group_info(&cr, pr->cred->group_info);
110 #else
111         get_group_info(pr->group_info);
112         set_cr_group_info(&cr, pr->group_info);
113 #endif
114 #else
115         cr.cr_ngroups = pr->ngroups;
116         memcpy(cr.cr_groups, pr->groups, NGROUPS * sizeof(gid_t));
117 #endif
118         rv = &cr;
119     }
120
121     return rv;
122 }
123 #endif
124
125 #else
126
127 const afs_ucred_t *
128 afs_osi_proc2cred(afs_proc_t * pr)
129 {
130     afs_ucred_t *rv = NULL;
131
132     if (pr == NULL) {
133         return NULL;
134     }
135     rv = pr->p_cred;
136
137     return rv;
138 }
139
140 #endif /* AFS_LINUX22_ENV */
141
142 #endif /* AFS_GCPAGS */