/*
* 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/
#include <linux/slab.h>
#include <libcfs/libcfs.h>
+#include <libcfs/lucache.h>
#include <obd.h>
#include <obd_class.h>
#include <obd_support.h>
#include <lustre_import.h>
#include <lustre_dlm.h>
#include <lustre_lib.h>
-#include <lustre_ucache.h>
#include "mdt_internal.h"
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,
[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);
}
EXIT;
out:
- OBD_FREE(upcall, size);
+ cfs_read_unlock(&cache->uc_upcall_rwlock);
return rc;
}
{
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;
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);
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);
}
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);
}