2 * Copyright 2000, International Business Machines Corporation and others.
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
11 * osi_cred.c - Linux cred handling routines.
14 #include <afsconfig.h>
15 #include "afs/param.h"
19 #include "afs/sysincludes.h"
20 #include "afsincludes.h"
22 /* Setup a pool for creds. Allocate several at a time. */
23 #define CRED_ALLOC_STEP 29 /* at 140 bytes/cred = 4060 bytes. */
26 static cred_t *cred_pool = NULL;
30 /* Cred locking assumes current single threaded non-preemptive kernel.
31 * Also assuming a fast path through both down and up if no waiters. Otherwise,
32 * test if no creds in pool before grabbing lock in crfree().
34 #if defined(AFS_LINUX24_ENV)
35 static DECLARE_MUTEX(linux_cred_pool_lock);
37 static struct semaphore linux_cred_pool_lock = MUTEX;
39 #define CRED_LOCK() down(&linux_cred_pool_lock)
40 #define CRED_UNLOCK() up(&linux_cred_pool_lock)
50 cred_pool = (cred_t*)osi_Alloc(CRED_ALLOC_STEP * sizeof(cred_t));
52 osi_Panic("crget: No more memory for creds!\n");
54 for (i=0; i < CRED_ALLOC_STEP-1; i++)
55 cred_pool[i].cr_ref = (long)&cred_pool[i+1];
56 cred_pool[i].cr_ref = 0;
59 cred_pool = (cred_t*)tmp->cr_ref;
63 memset(tmp, 0, sizeof(cred_t));
68 void crfree(cred_t *cr)
76 cr->cr_ref = (long)cred_pool;
83 /* Return a duplicate of the cred. */
84 cred_t *crdup(cred_t *cr)
86 cred_t *tmp = crget();
95 cr->cr_uid = current->fsuid;
96 cr->cr_ruid = current->uid;
97 cr->cr_gid = current->fsgid;
98 cr->cr_rgid = current->gid;
99 memcpy(cr->cr_groups, current->groups, NGROUPS * sizeof(gid_t));
100 cr->cr_ngroups = current->ngroups;
105 /* Set the cred info into the current task */
106 void crset(cred_t *cr)
108 current->fsuid = cr->cr_uid;
109 current->uid = cr->cr_ruid;
110 current->fsgid = cr->cr_gid;
111 current->gid = cr->cr_rgid;
112 memcpy(current->groups, cr->cr_groups, NGROUPS * sizeof(gid_t));
113 current->ngroups = cr->cr_ngroups;