-/* -*- 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.
/*
* 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
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);
}