Lines Matching refs:group_info
12 struct group_info *groups_alloc(int gidsetsize) in groups_alloc()
14 struct group_info *group_info; in groups_alloc() local
21 group_info = kmalloc(sizeof(*group_info) + nblocks*sizeof(gid_t *), GFP_USER); in groups_alloc()
22 if (!group_info) in groups_alloc()
24 group_info->ngroups = gidsetsize; in groups_alloc()
25 group_info->nblocks = nblocks; in groups_alloc()
26 atomic_set(&group_info->usage, 1); in groups_alloc()
29 group_info->blocks[0] = group_info->small_block; in groups_alloc()
36 group_info->blocks[i] = b; in groups_alloc()
39 return group_info; in groups_alloc()
43 free_page((unsigned long)group_info->blocks[i]); in groups_alloc()
45 kfree(group_info); in groups_alloc()
51 void groups_free(struct group_info *group_info) in groups_free() argument
53 if (group_info->blocks[0] != group_info->small_block) { in groups_free()
55 for (i = 0; i < group_info->nblocks; i++) in groups_free()
56 free_page((unsigned long)group_info->blocks[i]); in groups_free()
58 kfree(group_info); in groups_free()
65 const struct group_info *group_info) in groups_to_user() argument
69 unsigned int count = group_info->ngroups; in groups_to_user()
73 gid = from_kgid_munged(user_ns, GROUP_AT(group_info, i)); in groups_to_user()
81 static int groups_from_user(struct group_info *group_info, in groups_from_user() argument
86 unsigned int count = group_info->ngroups; in groups_from_user()
98 GROUP_AT(group_info, i) = kgid; in groups_from_user()
104 static void groups_sort(struct group_info *group_info) in groups_sort() argument
107 int gidsetsize = group_info->ngroups; in groups_sort()
118 kgid_t tmp = GROUP_AT(group_info, right); in groups_sort()
120 while (left >= 0 && gid_gt(GROUP_AT(group_info, left), tmp)) { in groups_sort()
121 GROUP_AT(group_info, right) = in groups_sort()
122 GROUP_AT(group_info, left); in groups_sort()
126 GROUP_AT(group_info, right) = tmp; in groups_sort()
133 int groups_search(const struct group_info *group_info, kgid_t grp) in groups_search() argument
137 if (!group_info) in groups_search()
141 right = group_info->ngroups; in groups_search()
144 if (gid_gt(grp, GROUP_AT(group_info, mid))) in groups_search()
146 else if (gid_lt(grp, GROUP_AT(group_info, mid))) in groups_search()
159 void set_groups(struct cred *new, struct group_info *group_info) in set_groups() argument
161 put_group_info(new->group_info); in set_groups()
162 groups_sort(group_info); in set_groups()
163 get_group_info(group_info); in set_groups()
164 new->group_info = group_info; in set_groups()
176 int set_current_groups(struct group_info *group_info) in set_current_groups() argument
184 set_groups(new, group_info); in set_current_groups()
199 i = cred->group_info->ngroups; in SYSCALL_DEFINE2()
205 if (groups_to_user(grouplist, cred->group_info)) { in SYSCALL_DEFINE2()
229 struct group_info *group_info; in SYSCALL_DEFINE2() local
237 group_info = groups_alloc(gidsetsize); in SYSCALL_DEFINE2()
238 if (!group_info) in SYSCALL_DEFINE2()
240 retval = groups_from_user(group_info, grouplist); in SYSCALL_DEFINE2()
242 put_group_info(group_info); in SYSCALL_DEFINE2()
246 retval = set_current_groups(group_info); in SYSCALL_DEFINE2()
247 put_group_info(group_info); in SYSCALL_DEFINE2()
261 retval = groups_search(cred->group_info, grp); in in_group_p()
273 retval = groups_search(cred->group_info, grp); in in_egroup_p()