Whamcloud - gitweb
LU-540 misc patch for user identity upcall/downcall
[fs/lustre-release.git] / lustre / mdt / mdt_identity.c
index f731044..6590e4e 100644 (file)
@@ -102,7 +102,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,
@@ -115,32 +115,23 @@ static int mdt_identity_do_upcall(struct upcall_cache *cache,
                   [2] = NULL
         };
         struct timeval start, end;
-        int size, rc;
+        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);
-
         cfs_read_lock(&cache->uc_upcall_rwlock);
-        memcpy(upcall, cache->uc_upcall, size - 1);
-        cfs_read_unlock(&cache->uc_upcall_rwlock);
-        upcall[size - 1] = 0;
-        if (unlikely(!strcmp(upcall, "NONE"))) {
+        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);
@@ -158,7 +149,7 @@ static int mdt_identity_do_upcall(struct upcall_cache *cache,
         }
         EXIT;
 out:
-        OBD_FREE(upcall, size);
+        cfs_read_unlock(&cache->uc_upcall_rwlock);
         return rc;
 }
 
@@ -168,7 +159,7 @@ static int mdt_identity_parse_downcall(struct upcall_cache *cache,
 {
         struct md_identity *identity = &entry->u.identity;
         struct identity_downcall_data *data = args;
-        cfs_group_info_t *ginfo;
+        cfs_group_info_t *ginfo = NULL;
         struct md_perm *perms = NULL;
         int size, i;
         ENTRY;
@@ -177,14 +168,16 @@ static int mdt_identity_parse_downcall(struct upcall_cache *cache,
         if (data->idd_ngroups > NGROUPS_MAX)
                 RETURN(-E2BIG);
 
-        ginfo = cfs_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);
@@ -192,7 +185,8 @@ static int mdt_identity_parse_downcall(struct upcall_cache *cache,
                 if (!perms) {
                         CERROR("failed to alloc %d permissions\n",
                                data->idd_nperms);
-                        cfs_put_group_info(ginfo);
+                        if (ginfo != NULL)
+                                cfs_put_group_info(ginfo);
                         RETURN(-ENOMEM);
                 }