Merge branch 'upstream-davem' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[pandora-kernel.git] / net / sunrpc / auth_unix.c
index 5ed91e5..46b2647 100644 (file)
@@ -60,31 +60,28 @@ static struct rpc_cred *
 unx_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
 {
        struct unx_cred *cred;
-       int             i;
+       unsigned int groups = 0;
+       unsigned int i;
 
        dprintk("RPC:       allocating UNIX cred for uid %d gid %d\n",
                        acred->uid, acred->gid);
 
-       if (!(cred = kmalloc(sizeof(*cred), GFP_KERNEL)))
+       if (!(cred = kmalloc(sizeof(*cred), GFP_NOFS)))
                return ERR_PTR(-ENOMEM);
 
        rpcauth_init_cred(&cred->uc_base, acred, auth, &unix_credops);
        cred->uc_base.cr_flags = 1UL << RPCAUTH_CRED_UPTODATE;
-       if (flags & RPCAUTH_LOOKUP_ROOTCREDS) {
-               cred->uc_uid = 0;
-               cred->uc_gid = 0;
-               cred->uc_gids[0] = NOGROUP;
-       } else {
-               int groups = acred->group_info->ngroups;
-               if (groups > NFS_NGROUPS)
-                       groups = NFS_NGROUPS;
-
-               cred->uc_gid = acred->gid;
-               for (i = 0; i < groups; i++)
-                       cred->uc_gids[i] = GROUP_AT(acred->group_info, i);
-               if (i < NFS_NGROUPS)
-                 cred->uc_gids[i] = NOGROUP;
-       }
+
+       if (acred->group_info != NULL)
+               groups = acred->group_info->ngroups;
+       if (groups > NFS_NGROUPS)
+               groups = NFS_NGROUPS;
+
+       cred->uc_gid = acred->gid;
+       for (i = 0; i < groups; i++)
+               cred->uc_gids[i] = GROUP_AT(acred->group_info, i);
+       if (i < NFS_NGROUPS)
+               cred->uc_gids[i] = NOGROUP;
 
        return &cred->uc_base;
 }
@@ -118,26 +115,21 @@ static int
 unx_match(struct auth_cred *acred, struct rpc_cred *rcred, int flags)
 {
        struct unx_cred *cred = container_of(rcred, struct unx_cred, uc_base);
-       int             i;
+       unsigned int groups = 0;
+       unsigned int i;
 
-       if (!(flags & RPCAUTH_LOOKUP_ROOTCREDS)) {
-               int groups;
 
-               if (cred->uc_uid != acred->uid
-                || cred->uc_gid != acred->gid)
-                       return 0;
+       if (cred->uc_uid != acred->uid || cred->uc_gid != acred->gid)
+               return 0;
 
+       if (acred->group_info != NULL)
                groups = acred->group_info->ngroups;
-               if (groups > NFS_NGROUPS)
-                       groups = NFS_NGROUPS;
-               for (i = 0; i < groups ; i++)
-                       if (cred->uc_gids[i] != GROUP_AT(acred->group_info, i))
-                               return 0;
-               return 1;
-       }
-       return (cred->uc_uid == 0
-            && cred->uc_gid == 0
-            && cred->uc_gids[0] == (gid_t) NOGROUP);
+       if (groups > NFS_NGROUPS)
+               groups = NFS_NGROUPS;
+       for (i = 0; i < groups ; i++)
+               if (cred->uc_gids[i] != GROUP_AT(acred->group_info, i))
+                       return 0;
+       return 1;
 }
 
 /*
@@ -218,9 +210,7 @@ void __init rpc_init_authunix(void)
 const struct rpc_authops authunix_ops = {
        .owner          = THIS_MODULE,
        .au_flavor      = RPC_AUTH_UNIX,
-#ifdef RPC_DEBUG
        .au_name        = "UNIX",
-#endif
        .create         = unx_create,
        .destroy        = unx_destroy,
        .lookup_cred    = unx_lookup_cred,
@@ -245,6 +235,7 @@ static
 const struct rpc_credops unix_credops = {
        .cr_name        = "AUTH_UNIX",
        .crdestroy      = unx_destroy_cred,
+       .crbind         = rpcauth_generic_bind_cred,
        .crmatch        = unx_match,
        .crmarshal      = unx_marshal,
        .crrefresh      = unx_refresh,