group_info
ceph_encode_32(p, req->r_cred->group_info->ngroups);
for (i = 0; i < req->r_cred->group_info->ngroups; i++)
req->r_cred->group_info->gid[i]));
len += sizeof(u32) + (sizeof(u64) * req->r_cred->group_info->ngroups);
if (!gid_matched && cred->group_info->ngroups) {
for (i = 0; i < cred->group_info->ngroups; i++) {
cred->group_info->gid[i]);
struct ext4_group_info ***group_info;
group_info = rcu_dereference(sbi->s_group_info);
kfree(group_info[idx]);
group_info[idx] = NULL;
struct ext4_group_info ***group_info;
group_info = rcu_dereference(sbi->s_group_info);
kfree(group_info[i]);
struct ext4_group_info *grinfo, ***group_info;
group_info = rcu_access_pointer(sbi->s_group_info);
if (group_info) {
kfree(group_info[i]);
kvfree(group_info);
put_group_info(entry->group_info);
struct group_info *ga, *gb;
ga = a->group_info;
gb = b->group_info;
cache->group_info = get_group_info(cred->group_info);
struct group_info *rqgi;
struct group_info *gi;
if (c1->group_info == NULL || c2->group_info == NULL)
return c1->group_info == c2->group_info;
if (c1->group_info->ngroups != c2->group_info->ngroups)
for (i = 0; i < c1->group_info->ngroups; i++) {
if (!gid_eq(c1->group_info->gid[i], c2->group_info->gid[i]))
static bool groups_equal(struct group_info *g1, struct group_info *g2)
struct group_info *group_info;
group_info = cred->group_info;
for (g = 0; g < group_info->ngroups; g++)
from_kgid_munged(user_ns, group_info->gid[g]));
struct group_info *gi;
struct group_info *group_info; /* supplementary groups for euid/fsgid */
struct group_info *__groups; \
__groups = get_group_info(__cred->group_info); \
static inline struct group_info *get_group_info(struct group_info *gi)
#define put_group_info(group_info) \
if (refcount_dec_and_test(&(group_info)->usage)) \
groups_free(group_info); \
extern struct group_info *groups_alloc(int);
extern void groups_free(struct group_info *);
extern int groups_search(const struct group_info *, kgid_t);
extern int set_current_groups(struct group_info *);
extern void set_groups(struct cred *, struct group_info *);
extern void groups_sort(struct group_info *);
static inline void groups_free(struct group_info *group_info)
static inline int groups_search(const struct group_info *group_info, kgid_t grp)
struct group_info *group_info;
struct group_info *cr_group_info;
static struct group_info init_groups = { .usage = REFCOUNT_INIT(2) };
.group_info = &init_groups,
result = groups_search(cred->group_info, f->gid);
result = !groups_search(cred->group_info, f->gid);
result = groups_search(cred->group_info, f->gid);
result = !groups_search(cred->group_info, f->gid);
get_group_info(new->group_info);
struct group_info *ga, *gb;
ga = a->group_info;
gb = b->group_info;
if (cred->group_info)
put_group_info(cred->group_info);
get_group_info(new->group_info);
right = group_info->ngroups;
if (gid_gt(grp, group_info->gid[mid]))
else if (gid_lt(grp, group_info->gid[mid]))
void set_groups(struct cred *new, struct group_info *group_info)
put_group_info(new->group_info);
get_group_info(group_info);
new->group_info = group_info;
int set_current_groups(struct group_info *group_info)
set_groups(new, group_info);
struct group_info *groups_alloc(int gidsetsize)
struct group_info *gi;
i = cred->group_info->ngroups;
if (groups_to_user(grouplist, cred->group_info)) {
struct group_info *group_info;
group_info = groups_alloc(gidsetsize);
if (!group_info)
retval = groups_from_user(group_info, grouplist);
put_group_info(group_info);
groups_sort(group_info);
retval = set_current_groups(group_info);
put_group_info(group_info);
retval = groups_search(cred->group_info, grp);
retval = groups_search(cred->group_info, grp);
void groups_free(struct group_info *group_info)
kvfree(group_info);
const struct group_info *group_info)
unsigned int count = group_info->ngroups;
gid = from_kgid_munged(user_ns, group_info->gid[i]);
static int groups_from_user(struct group_info *group_info,
unsigned int count = group_info->ngroups;
group_info->gid[i] = kgid;
void groups_sort(struct group_info *group_info)
sort(group_info->gid, group_info->ngroups, sizeof(*group_info->gid),
int groups_search(const struct group_info *group_info, kgid_t grp)
if (!group_info)
struct group_info *group_info)
for (i = 0; i < group_info->ngroups; i++) {
kgid = group_info->gid[i];
static int groups16_from_user(struct group_info *group_info,
for (i = 0; i < group_info->ngroups; i++) {
group_info->gid[i] = kgid;
i = cred->group_info->ngroups;
if (groups16_to_user(grouplist, cred->group_info)) {
struct group_info *group_info;
group_info = groups_alloc(gidsetsize);
if (!group_info)
retval = groups16_from_user(group_info, grouplist);
put_group_info(group_info);
groups_sort(group_info);
retval = set_current_groups(group_info);
put_group_info(group_info);
static int groups_to_user(sockptr_t dst, const struct group_info *src)
n = cred->group_info->ngroups;
ret = groups_to_user(optval, cred->group_info);
struct group_info *group_info;
group_info = get_current_groups();
for (i = 0; i < group_info->ngroups; i++) {
kgid_t gid = group_info->gid[i];
put_group_info(group_info);
struct group_info *gi = filp->f_cred->group_info;
if (!gid_eq(cred->cr_cred->group_info->gid[i], acred->cred->group_info->gid[i]))
struct group_info *gi = cred->cr_cred->group_info;
if (acred->cred->group_info != NULL)
groups = acred->cred->group_info->ngroups;
if (cred->cr_cred->group_info == NULL)
if (groups != cred->cr_cred->group_info->ngroups)
if (cred->group_info)
svc->cr_group_info = get_group_info(cred->group_info);
struct group_info *gi;
static struct group_info *unix_gid_find(kuid_t uid, struct svc_rqst *rqstp)
struct group_info *gi;
struct group_info *gi;
ret = groups_search(cred->group_info, key->gid);
new->group_info = get_group_info(old->group_info);
get_group_info(new->group_info);
for (i = 0; i < new->group_info->ngroups; i++) {
if (!id_permitted_for_cred(old, (kid_t){.gid = new->group_info->gid[i]}, GID)) {
put_group_info(new->group_info);
put_group_info(new->group_info);
} group_info;
*poutstream_map = hr.u.d.u.group_info.outstream_group_map;
*pinstream_map = hr.u.d.u.group_info.instream_group_map;
*poutstream_map = hr.u.d.u.group_info.outstream_group_map;
*pinstream_map = hr.u.d.u.group_info.instream_group_map;