Linux 4.9 compat: group_info changes

In Linux 4.9, torvalds/linux@81243ea, group_info changed from 2d array via
->blocks to 1d array via ->gid. We change the spl cred functions accordingly.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
Closes #581
This commit is contained in:
Chunwei Chen
2016-10-18 17:30:41 -07:00
committed by Brian Behlendorf
parent 87063d7dc3
commit ae7eda1dde
4 changed files with 41 additions and 2 deletions
+10
View File
@@ -85,7 +85,9 @@ crgetngroups(const cred_t *cr)
gi = cr->group_info;
rc = gi->ngroups;
#ifndef HAVE_GROUP_INFO_GID
/*
* For Linux <= 4.8,
* crgetgroups will only returns gi->blocks[0], which contains only
* the first NGROUPS_PER_BLOCK groups.
*/
@@ -93,12 +95,16 @@ crgetngroups(const cred_t *cr)
WARN_ON_ONCE(1);
rc = NGROUPS_PER_BLOCK;
}
#endif
return rc;
}
/*
* Return an array of supplemental gids. The returned address is safe
* to use as long as the caller has taken a reference with crhold().
*
* Linux 4.9 API change, group_info changed from 2d array via ->blocks to 1d
* array via ->gid.
*/
gid_t *
crgetgroups(const cred_t *cr)
@@ -107,8 +113,12 @@ crgetgroups(const cred_t *cr)
gid_t *gids = NULL;
gi = cr->group_info;
#ifdef HAVE_GROUP_INFO_GID
gids = KGIDP_TO_SGIDP(gi->gid);
#else
if (gi->nblocks > 0)
gids = KGIDP_TO_SGIDP(gi->blocks[0]);
#endif
return gids;
}