struct lu_ucred *uc = (struct lu_ucred *)args;
struct md_identity *identity;
bool supp_in_ginfo[2];
- gid_t *glist_p;
- int i;
+ gid_t *groups = NULL, *glist_p;
+ int groups_num, i, rc = 0;
if (*grouplist || !uc || uc->uc_suppgids[0] == -1)
/* grouplist already built, or no supp groups
* => return immediately
*/
- return 0;
+ goto out;
identity = &entry->u.identity;
*fsgid = uc->uc_fsgid;
supp_in_ginfo[1] = (uc->uc_suppgids[1] == -1);
if (!identity->mi_ginfo || !identity->mi_ginfo->ngroups)
- *ngroups = 0;
+ groups_num = 0;
else
- *ngroups = identity->mi_ginfo->ngroups;
+ groups_num = identity->mi_ginfo->ngroups;
/* check if provided supp groups are already in cache */
for (i = 0; i < 2 && uc->uc_suppgids[i] != -1; i++) {
if (unlikely(uc->uc_suppgids[i] == uc->uc_fsuid)) {
/* Do not place user's group ID in group list */
supp_in_ginfo[i] = true;
- } else if (*ngroups) {
+ } else if (groups_num) {
atomic_inc(&identity->mi_ginfo->usage);
supp_in_ginfo[i] =
lustre_groups_search(identity->mi_ginfo,
cache->uc_name, uc->uc_suppgids[0],
uc->uc_suppgids[1], entry->ue_key);
- *ngroups += !supp_in_ginfo[0] + !supp_in_ginfo[1];
- CFS_ALLOC_PTR_ARRAY(*grouplist, *ngroups);
- if (*grouplist == NULL)
- return -ENOMEM;
+ if (!supp_in_ginfo[0])
+ groups_num++;
+ if (!supp_in_ginfo[1])
+ groups_num++;
+ CFS_ALLOC_PTR_ARRAY(groups, groups_num);
+ if (groups == NULL)
+ GOTO(out, rc = -ENOMEM);
- glist_p = *grouplist;
+ glist_p = groups;
for (i = 0; i < 2; i++) {
if (!supp_in_ginfo[i])
*(glist_p++) = uc->uc_suppgids[i];
}
}
- return 0;
+out:
+ if (groups) {
+ *grouplist = groups;
+ *ngroups = groups_num;
+ }
+ return rc;
}