Merge tag 'nfs-for-4.9-1' of git://git.linux-nfs.org/projects/anna/linux-nfs
[cascardo/linux.git] / net / sunrpc / auth_unix.c
index a99278c..306fc0f 100644 (file)
@@ -46,6 +46,14 @@ unx_destroy(struct rpc_auth *auth)
        rpcauth_clear_credcache(auth->au_credcache);
 }
 
+static int
+unx_hash_cred(struct auth_cred *acred, unsigned int hashbits)
+{
+       return hash_64(from_kgid(&init_user_ns, acred->gid) |
+               ((u64)from_kuid(&init_user_ns, acred->uid) <<
+                       (sizeof(gid_t) * 8)), hashbits);
+}
+
 /*
  * Lookup AUTH_UNIX creds for current process
  */
@@ -79,7 +87,7 @@ unx_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags, gfp_t
 
        cred->uc_gid = acred->gid;
        for (i = 0; i < groups; i++)
-               cred->uc_gids[i] = GROUP_AT(acred->group_info, i);
+               cred->uc_gids[i] = acred->group_info->gid[i];
        if (i < NFS_NGROUPS)
                cred->uc_gids[i] = INVALID_GID;
 
@@ -127,7 +135,7 @@ unx_match(struct auth_cred *acred, struct rpc_cred *rcred, int flags)
        if (groups > NFS_NGROUPS)
                groups = NFS_NGROUPS;
        for (i = 0; i < groups ; i++)
-               if (!gid_eq(cred->uc_gids[i], GROUP_AT(acred->group_info, i)))
+               if (!gid_eq(cred->uc_gids[i], acred->group_info->gid[i]))
                        return 0;
        if (groups < NFS_NGROUPS && gid_valid(cred->uc_gids[groups]))
                return 0;
@@ -220,6 +228,7 @@ const struct rpc_authops authunix_ops = {
        .au_name        = "UNIX",
        .create         = unx_create,
        .destroy        = unx_destroy,
+       .hash_cred      = unx_hash_cred,
        .lookup_cred    = unx_lookup_cred,
        .crcreate       = unx_create_cred,
 };