Whamcloud - gitweb
b=22781 fix the waiting time/race of identity upcall.
[fs/lustre-release.git] / lustre / mdt / mdt_identity.c
index 3243e65..434ddbd 100644 (file)
@@ -26,7 +26,7 @@
  * 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.
  */
 /*
@@ -87,7 +87,7 @@ static void mdt_identity_entry_free(struct upcall_cache *cache,
         struct md_identity *identity = &entry->u.identity;
 
         if (identity->mi_ginfo) {
-                groups_free(identity->mi_ginfo);
+                cfs_put_group_info(identity->mi_ginfo);
                 identity->mi_ginfo = NULL;
         }
 
@@ -114,6 +114,7 @@ static int mdt_identity_do_upcall(struct upcall_cache *cache,
                   [1] = "PATH=/sbin:/usr/sbin",
                   [2] = NULL
         };
+        struct timeval start, end;
         int size, rc;
         ENTRY;
 
@@ -125,9 +126,9 @@ static int mdt_identity_do_upcall(struct upcall_cache *cache,
         if (unlikely(!upcall))
                 RETURN(-ENOMEM);
 
-        read_lock(&cache->uc_upcall_rwlock);
+        cfs_read_lock(&cache->uc_upcall_rwlock);
         memcpy(upcall, cache->uc_upcall, size - 1);
-        read_unlock(&cache->uc_upcall_rwlock);
+        cfs_read_unlock(&cache->uc_upcall_rwlock);
         upcall[size - 1] = 0;
         if (unlikely(!strcmp(upcall, "NONE"))) {
                 CERROR("no upcall set\n");
@@ -140,15 +141,19 @@ static int mdt_identity_do_upcall(struct upcall_cache *cache,
 
         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;
@@ -163,7 +168,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;
         struct md_perm *perms = NULL;
         int size, i;
         ENTRY;
@@ -172,7 +177,7 @@ static int mdt_identity_parse_downcall(struct upcall_cache *cache,
         if (data->idd_ngroups > NGROUPS_MAX)
                 RETURN(-E2BIG);
 
-        ginfo = groups_alloc(data->idd_ngroups);
+        ginfo = cfs_groups_alloc(data->idd_ngroups);
         if (!ginfo) {
                 CERROR("failed to alloc %d groups\n", data->idd_ngroups);
                 RETURN(-ENOMEM);
@@ -187,7 +192,7 @@ static int mdt_identity_parse_downcall(struct upcall_cache *cache,
                 if (!perms) {
                         CERROR("failed to alloc %d permissions\n",
                                data->idd_nperms);
-                        groups_free(ginfo);
+                        cfs_put_group_info(ginfo);
                         RETURN(-ENOMEM);
                 }
 
@@ -285,10 +290,8 @@ __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 ptlrpc_request   *req = mdt_info_req(info);
         struct md_ucred         *uc = mdt_ucred(info);
         struct md_object        *next = mdt_object_child(o);
-        struct mdt_export_data  *med = mdt_req2med(req);
         struct mdt_remote_perm  *perm = buf;
 
         ENTRY;
@@ -296,7 +299,7 @@ int mdt_pack_remote_perm(struct mdt_thread_info *info, struct mdt_object *o,
         /* remote client request always pack ptlrpc_user_desc! */
         LASSERT(perm);
 
-        if (!med->med_rmtclient)
+        if (!exp_connect_rmtclient(info->mti_exp))
                 RETURN(-EBADE);
 
         if ((uc->mu_valid != UCRED_OLD) && (uc->mu_valid != UCRED_NEW))