Whamcloud - gitweb
LU-1403 ucred: ucred cleanup
[fs/lustre-release.git] / lustre / mdt / mdt_identity.c
index f7b1658..e8612d1 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright (c) 2011, Whamcloud, Inc.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
  * Author: Fan Yong <fanyong@clusterfs.com>
  */
 
-#ifndef EXPORT_SYMTAB
-#define EXPORT_SYMTAB
-#endif
 #define DEBUG_SUBSYSTEM S_MDS
 
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
@@ -56,7 +50,6 @@
 #include <linux/errno.h>
 #include <linux/version.h>
 #include <linux/unistd.h>
-#include <asm/system.h>
 #include <asm/uaccess.h>
 #include <linux/fs.h>
 #include <linux/stat.h>
@@ -64,6 +57,7 @@
 #include <linux/slab.h>
 
 #include <libcfs/libcfs.h>
+#include <libcfs/lucache.h>
 #include <obd.h>
 #include <obd_class.h>
 #include <obd_support.h>
@@ -71,7 +65,6 @@
 #include <lustre_import.h>
 #include <lustre_dlm.h>
 #include <lustre_lib.h>
-#include <lustre_ucache.h>
 
 #include "mdt_internal.h"
 
@@ -87,7 +80,7 @@ static void mdt_identity_entry_free(struct upcall_cache *cache,
         struct md_identity *identity = &entry->u.identity;
 
         if (identity->mi_ginfo) {
-                put_group_info(identity->mi_ginfo);
+                cfs_put_group_info(identity->mi_ginfo);
                 identity->mi_ginfo = NULL;
         }
 
@@ -102,7 +95,7 @@ static void mdt_identity_entry_free(struct upcall_cache *cache,
 static int mdt_identity_do_upcall(struct upcall_cache *cache,
                                   struct upcall_cache_entry *entry)
 {
-        char *upcall, keystr[16];
+        char keystr[16];
         char *argv[] = {
                   [0] = cache->uc_upcall,
                   [1] = cache->uc_name,
@@ -114,46 +107,42 @@ static int mdt_identity_do_upcall(struct upcall_cache *cache,
                   [1] = "PATH=/sbin:/usr/sbin",
                   [2] = NULL
         };
-        int size, rc;
+        struct timeval start, end;
+        int rc;
         ENTRY;
 
         /* There is race condition:
          * "uc_upcall" was changed just after "is_identity_get_disabled" check.
          */
-        size = strlen(cache->uc_upcall) + 1;
-        OBD_ALLOC(upcall, size);
-        if (unlikely(!upcall))
-                RETURN(-ENOMEM);
-
-        read_lock(&cache->uc_upcall_rwlock);
-        memcpy(upcall, cache->uc_upcall, size - 1);
-        read_unlock(&cache->uc_upcall_rwlock);
-        upcall[size - 1] = 0;
-        if (unlikely(!strcmp(upcall, "NONE"))) {
+       read_lock(&cache->uc_upcall_rwlock);
+        CDEBUG(D_INFO, "The upcall is: '%s'\n", cache->uc_upcall);
+
+        if (unlikely(!strcmp(cache->uc_upcall, "NONE"))) {
                 CERROR("no upcall set\n");
                 GOTO(out, rc = -EREMCHG);
         }
 
-        argv[0] = upcall;
-
+        argv[0] = cache->uc_upcall;
         snprintf(keystr, sizeof(keystr), LPU64, entry->ue_key);
 
-        CDEBUG(D_INFO, "The upcall is: '%s'\n", cache->uc_upcall);
-
+        cfs_gettimeofday(&start);
         rc = USERMODEHELPER(argv[0], argv, envp);
+        cfs_gettimeofday(&end);
         if (rc < 0) {
                 CERROR("%s: error invoking upcall %s %s %s: rc %d; "
-                       "check /proc/fs/lustre/mdt/%s/identity_upcall\n",
+                       "check /proc/fs/lustre/mdt/%s/identity_upcall, "
+                       "time %ldus\n",
                        cache->uc_name, argv[0], argv[1], argv[2], rc,
-                       cache->uc_name);
+                       cache->uc_name, cfs_timeval_sub(&end, &start, NULL));
         } else {
-                CDEBUG(D_HA, "%s: invoked upcall %s %s %s\n", cache->uc_name,
-                       argv[0], argv[1], argv[2]);
+                CDEBUG(D_HA, "%s: invoked upcall %s %s %s, time %ldus\n",
+                       cache->uc_name, argv[0], argv[1], argv[2],
+                       cfs_timeval_sub(&end, &start, NULL));
                 rc = 0;
         }
         EXIT;
 out:
-        OBD_FREE(upcall, size);
+       read_unlock(&cache->uc_upcall_rwlock);
         return rc;
 }
 
@@ -163,7 +152,7 @@ static int mdt_identity_parse_downcall(struct upcall_cache *cache,
 {
         struct md_identity *identity = &entry->u.identity;
         struct identity_downcall_data *data = args;
-        struct group_info *ginfo;
+        cfs_group_info_t *ginfo = NULL;
         struct md_perm *perms = NULL;
         int size, i;
         ENTRY;
@@ -172,14 +161,16 @@ static int mdt_identity_parse_downcall(struct upcall_cache *cache,
         if (data->idd_ngroups > NGROUPS_MAX)
                 RETURN(-E2BIG);
 
-        ginfo = groups_alloc(data->idd_ngroups);
-        if (!ginfo) {
-                CERROR("failed to alloc %d groups\n", data->idd_ngroups);
-                RETURN(-ENOMEM);
-        }
+        if (data->idd_ngroups > 0) {
+                ginfo = cfs_groups_alloc(data->idd_ngroups);
+                if (!ginfo) {
+                        CERROR("failed to alloc %d groups\n", data->idd_ngroups);
+                        RETURN(-ENOMEM);
+                }
 
-        lustre_groups_from_list(ginfo, data->idd_groups);
-        lustre_groups_sort(ginfo);
+                lustre_groups_from_list(ginfo, data->idd_groups);
+                lustre_groups_sort(ginfo);
+        }
 
         if (data->idd_nperms) {
                 size = data->idd_nperms * sizeof(*perms);
@@ -187,7 +178,8 @@ static int mdt_identity_parse_downcall(struct upcall_cache *cache,
                 if (!perms) {
                         CERROR("failed to alloc %d permissions\n",
                                data->idd_nperms);
-                        put_group_info(ginfo);
+                        if (ginfo != NULL)
+                                cfs_put_group_info(ginfo);
                         RETURN(-ENOMEM);
                 }
 
@@ -205,7 +197,7 @@ static int mdt_identity_parse_downcall(struct upcall_cache *cache,
 
         CDEBUG(D_OTHER, "parse mdt identity@%p: %d:%d, ngroups %u, nperms %u\n",
                identity, identity->mi_uid, identity->mi_gid,
-               identity->mi_ginfo->ngroups, identity->mi_nperms);
+               data->idd_ngroups, data->idd_nperms);
 
         RETURN(0);
 }
@@ -285,7 +277,7 @@ __u32 mdt_identity_get_perm(struct md_identity *identity,
 int mdt_pack_remote_perm(struct mdt_thread_info *info, struct mdt_object *o,
                          void *buf)
 {
-        struct md_ucred         *uc = mdt_ucred(info);
+       struct lu_ucred         *uc = mdt_ucred_check(info);
         struct md_object        *next = mdt_object_child(o);
         struct mdt_remote_perm  *perm = buf;
 
@@ -297,13 +289,13 @@ int mdt_pack_remote_perm(struct mdt_thread_info *info, struct mdt_object *o,
         if (!exp_connect_rmtclient(info->mti_exp))
                 RETURN(-EBADE);
 
-        if ((uc->mu_valid != UCRED_OLD) && (uc->mu_valid != UCRED_NEW))
-                RETURN(-EINVAL);
+       if (uc == NULL)
+               RETURN(-EINVAL);
 
-        perm->rp_uid = uc->mu_o_uid;
-        perm->rp_gid = uc->mu_o_gid;
-        perm->rp_fsuid = uc->mu_o_fsuid;
-        perm->rp_fsgid = uc->mu_o_fsgid;
+       perm->rp_uid = uc->uc_o_uid;
+       perm->rp_gid = uc->uc_o_gid;
+       perm->rp_fsuid = uc->uc_o_fsuid;
+       perm->rp_fsgid = uc->uc_o_fsgid;
 
         perm->rp_access_perm = 0;
         if (mo_permission(info->mti_env, NULL, next, NULL, MAY_READ) == 0)