Linux: Mark our super block as not updating access time
[openafs.git] / src / afs / LINUX24 / osi_cred.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 /*
11  * osi_cred.c - Linux cred handling routines.
12  *
13  */
14 #include <afsconfig.h>
15 #include "afs/param.h"
16
17
18 #include "afs/sysincludes.h"
19 #include "afsincludes.h"
20
21 cred_t *
22 crget(void)
23 {
24     cred_t *tmp;
25     
26 #if !defined(GFP_NOFS)
27 #define GFP_NOFS GFP_KERNEL
28 #endif
29     tmp = kmalloc(sizeof(cred_t), GFP_NOFS);
30     if (!tmp)
31         osi_Panic("crget: No more memory for creds!\n");
32     
33     tmp->cr_ref = 1;
34     return tmp;
35 }
36
37 void
38 crfree(cred_t * cr)
39 {
40     if (cr->cr_ref > 1) {
41         cr->cr_ref--;
42         return;
43     }
44
45     kfree(cr);
46 }
47
48
49 /* Return a duplicate of the cred. */
50 cred_t *
51 crdup(cred_t * cr)
52 {
53     cred_t *tmp = crget();
54
55     afs_set_cr_uid(tmp, afs_cr_uid(cr));
56     afs_set_cr_ruid(tmp, afs_cr_ruid(cr));
57     afs_set_cr_gid(tmp, afs_cr_gid(cr));
58     afs_set_cr_rgid(tmp, afs_cr_rgid(cr));
59
60     memcpy(tmp->cr_groups, cr->cr_groups, NGROUPS * sizeof(gid_t));
61     tmp->cr_ngroups = cr->cr_ngroups;
62
63     return tmp;
64 }
65
66 cred_t *
67 crref(void)
68 {
69     cred_t *cr = crget();
70
71     afs_set_cr_uid(cr, current_fsuid());
72     afs_set_cr_ruid(cr, current_uid());
73     afs_set_cr_gid(cr, current_fsgid());
74     afs_set_cr_rgid(cr, current_gid());
75
76     memcpy(cr->cr_groups, current->groups, NGROUPS * sizeof(gid_t));
77     cr->cr_ngroups = current->ngroups;
78
79     return cr;
80 }
81
82
83 /* Set the cred info into the current task */
84 void
85 crset(cred_t * cr)
86 {
87 #if defined(STRUCT_TASK_HAS_CRED)
88     struct cred *new_creds;
89
90     /* If our current task doesn't have identical real and effective
91      * credentials, commit_cred won't let us change them, so we just
92      * bail here.
93      */
94     if (current->cred != current->real_cred)
95         return;
96     new_creds = prepare_creds();
97     new_creds->fsuid = afs_cr_uid(cr);
98     new_creds->uid = afs_cr_ruid(cr);
99     new_creds->fsgid = afs_cr_gid(cr);
100     new_creds->gid = afs_cr_rgid(cr);
101 #else
102     current->fsuid = afs_cr_uid(cr);
103     current->uid = afs_cr_ruid(cr);
104     current->fsgid = afs_cr_gid(cr);
105     current->gid = afs_cr_rgid(cr);
106 #endif
107     memcpy(current->groups, cr->cr_groups, NGROUPS * sizeof(gid_t));
108     current->ngroups = cr->cr_ngroups;
109 }