Whamcloud - gitweb
LU-9019 mdt: use ktime_t for calculating elapsed time
[fs/lustre-release.git] / lustre / mdt / mdt_identity.c
index 0e2a3e2..e8ec709 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
@@ -27,7 +23,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, Whamcloud, Inc.
+ * Copyright (c) 2011, 2016, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -57,7 +53,6 @@
 #include <linux/slab.h>
 
 #include <libcfs/libcfs.h>
-#include <libcfs/lucache.h>
 #include <obd.h>
 #include <obd_class.h>
 #include <obd_support.h>
@@ -75,21 +70,21 @@ static void mdt_identity_entry_init(struct upcall_cache_entry *entry,
 }
 
 static void mdt_identity_entry_free(struct upcall_cache *cache,
-                                    struct upcall_cache_entry *entry)
+                                   struct upcall_cache_entry *entry)
 {
-        struct md_identity *identity = &entry->u.identity;
-
-        if (identity->mi_ginfo) {
-                cfs_put_group_info(identity->mi_ginfo);
-                identity->mi_ginfo = NULL;
-        }
-
-        if (identity->mi_nperms) {
-                LASSERT(identity->mi_perms);
-                OBD_FREE(identity->mi_perms,
-                         identity->mi_nperms * sizeof(struct md_perm));
-                identity->mi_nperms = 0;
-        }
+       struct md_identity *identity = &entry->u.identity;
+
+       if (identity->mi_ginfo) {
+               put_group_info(identity->mi_ginfo);
+               identity->mi_ginfo = NULL;
+       }
+
+       if (identity->mi_nperms) {
+               LASSERT(identity->mi_perms);
+               OBD_FREE(identity->mi_perms,
+                        identity->mi_nperms * sizeof(struct md_perm));
+               identity->mi_nperms = 0;
+       }
 }
 
 static int mdt_identity_do_upcall(struct upcall_cache *cache,
@@ -107,14 +102,14 @@ static int mdt_identity_do_upcall(struct upcall_cache *cache,
                   [1] = "PATH=/sbin:/usr/sbin",
                   [2] = NULL
         };
-        struct timeval start, end;
+       ktime_t start, end;
         int rc;
         ENTRY;
 
         /* There is race condition:
          * "uc_upcall" was changed just after "is_identity_get_disabled" check.
          */
-        cfs_read_lock(&cache->uc_upcall_rwlock);
+       down_read(&cache->uc_upcall_rwsem);
         CDEBUG(D_INFO, "The upcall is: '%s'\n", cache->uc_upcall);
 
         if (unlikely(!strcmp(cache->uc_upcall, "NONE"))) {
@@ -122,84 +117,82 @@ static int mdt_identity_do_upcall(struct upcall_cache *cache,
                 GOTO(out, rc = -EREMCHG);
         }
 
-        argv[0] = cache->uc_upcall;
-        snprintf(keystr, sizeof(keystr), LPU64, entry->ue_key);
-
-        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, "
-                       "time %ldus\n",
-                       cache->uc_name, argv[0], argv[1], argv[2], rc,
-                       cache->uc_name, cfs_timeval_sub(&end, &start, NULL));
-        } else {
-                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;
+       argv[0] = cache->uc_upcall;
+       snprintf(keystr, sizeof(keystr), "%llu", entry->ue_key);
+
+       start = ktime_get();
+       rc = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
+       end = ktime_get();
+       if (rc < 0) {
+               CERROR("%s: error invoking upcall %s %s %s: rc %d; check /proc/fs/lustre/mdt/%s/identity_upcall, time %ldus\n",
+                      cache->uc_name, argv[0], argv[1], argv[2], rc,
+                      cache->uc_name, (long)ktime_us_delta(end, start));
+       } else {
+               CDEBUG(D_HA, "%s: invoked upcall %s %s %s, time %ldus\n",
+                      cache->uc_name, argv[0], argv[1], argv[2],
+                      (long)ktime_us_delta(end, start));
+               rc = 0;
+       }
+       EXIT;
 out:
-        cfs_read_unlock(&cache->uc_upcall_rwlock);
-        return rc;
+       up_read(&cache->uc_upcall_rwsem);
+       return rc;
 }
 
 static int mdt_identity_parse_downcall(struct upcall_cache *cache,
-                                       struct upcall_cache_entry *entry,
-                                       void *args)
+                                      struct upcall_cache_entry *entry,
+                                      void *args)
 {
-        struct md_identity *identity = &entry->u.identity;
-        struct identity_downcall_data *data = args;
-        cfs_group_info_t *ginfo = NULL;
-        struct md_perm *perms = NULL;
-        int size, i;
-        ENTRY;
-
-        LASSERT(data);
-        if (data->idd_ngroups > NGROUPS_MAX)
-                RETURN(-E2BIG);
-
-        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);
-        }
-
-        if (data->idd_nperms) {
-                size = data->idd_nperms * sizeof(*perms);
-                OBD_ALLOC(perms, size);
-                if (!perms) {
-                        CERROR("failed to alloc %d permissions\n",
-                               data->idd_nperms);
-                        if (ginfo != NULL)
-                                cfs_put_group_info(ginfo);
-                        RETURN(-ENOMEM);
-                }
-
-                for (i = 0; i < data->idd_nperms; i++) {
-                        perms[i].mp_nid = data->idd_perms[i].pdd_nid;
-                        perms[i].mp_perm = data->idd_perms[i].pdd_perm;
-                }
-        }
-
-        identity->mi_uid = data->idd_uid;
-        identity->mi_gid = data->idd_gid;
-        identity->mi_ginfo = ginfo;
-        identity->mi_nperms = data->idd_nperms;
-        identity->mi_perms = perms;
-
-        CDEBUG(D_OTHER, "parse mdt identity@%p: %d:%d, ngroups %u, nperms %u\n",
-               identity, identity->mi_uid, identity->mi_gid,
-               data->idd_ngroups, data->idd_nperms);
-
-        RETURN(0);
+       struct md_identity *identity = &entry->u.identity;
+       struct identity_downcall_data *data = args;
+       struct group_info *ginfo = NULL;
+       struct md_perm *perms = NULL;
+       int size, i;
+       ENTRY;
+
+       LASSERT(data);
+       if (data->idd_ngroups > NGROUPS_MAX)
+               RETURN(-E2BIG);
+
+       if (data->idd_ngroups > 0) {
+               ginfo = 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);
+       }
+
+       if (data->idd_nperms) {
+               size = data->idd_nperms * sizeof(*perms);
+               OBD_ALLOC(perms, size);
+               if (!perms) {
+                       CERROR("failed to alloc %d permissions\n",
+                              data->idd_nperms);
+                       if (ginfo != NULL)
+                               put_group_info(ginfo);
+                       RETURN(-ENOMEM);
+               }
+
+               for (i = 0; i < data->idd_nperms; i++) {
+                       perms[i].mp_nid = data->idd_perms[i].pdd_nid;
+                       perms[i].mp_perm = data->idd_perms[i].pdd_perm;
+               }
+       }
+
+       identity->mi_uid = data->idd_uid;
+       identity->mi_gid = data->idd_gid;
+       identity->mi_ginfo = ginfo;
+       identity->mi_nperms = data->idd_nperms;
+       identity->mi_perms = perms;
+
+       CDEBUG(D_OTHER, "parse mdt identity@%p: %d:%d, ngroups %u, nperms %u\n",
+              identity, identity->mi_uid, identity->mi_gid,
+              data->idd_ngroups, data->idd_nperms);
+
+       RETURN(0);
 }
 
 struct md_identity *mdt_identity_get(struct upcall_cache *cache, __u32 uid)
@@ -246,16 +239,14 @@ void mdt_flush_identity(struct upcall_cache *cache, int uid)
  * If there is LNET_NID_ANY in perm[i].mp_nid,
  * it must be perm[0].mp_nid, and act as default perm.
  */
-__u32 mdt_identity_get_perm(struct md_identity *identity,
-                            __u32 is_rmtclient, lnet_nid_t nid)
+__u32 mdt_identity_get_perm(struct md_identity *identity, lnet_nid_t nid)
 {
-        struct md_perm *perm;
-        int i;
 
-        if (!identity) {
-                LASSERT(is_rmtclient == 0);
-                return CFS_SETGRP_PERM;
-        }
+       struct md_perm *perm;
+       int i;
+
+       if (!identity)
+               return CFS_SETGRP_PERM;
 
         perm = identity->mi_perms;
         /* check exactly matched nid first */
@@ -271,39 +262,5 @@ __u32 mdt_identity_get_perm(struct md_identity *identity,
                 return perm[0].mp_perm;
 
         /* return default last */
-        return is_rmtclient ? 0 : CFS_SETGRP_PERM;
-}
-
-int mdt_pack_remote_perm(struct mdt_thread_info *info, struct mdt_object *o,
-                         void *buf)
-{
-        struct md_ucred         *uc = mdt_ucred(info);
-        struct md_object        *next = mdt_object_child(o);
-        struct mdt_remote_perm  *perm = buf;
-
-        ENTRY;
-
-        /* remote client request always pack ptlrpc_user_desc! */
-        LASSERT(perm);
-
-        if (!exp_connect_rmtclient(info->mti_exp))
-                RETURN(-EBADE);
-
-        if ((uc->mu_valid != UCRED_OLD) && (uc->mu_valid != UCRED_NEW))
-                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_access_perm = 0;
-        if (mo_permission(info->mti_env, NULL, next, NULL, MAY_READ) == 0)
-                perm->rp_access_perm |= MAY_READ;
-        if (mo_permission(info->mti_env, NULL, next, NULL, MAY_WRITE) == 0)
-                perm->rp_access_perm |= MAY_WRITE;
-        if (mo_permission(info->mti_env, NULL, next, NULL, MAY_EXEC) == 0)
-                perm->rp_access_perm |= MAY_EXEC;
-
-        RETURN(0);
+       return CFS_SETGRP_PERM;
 }