X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_identity.c;h=0e2a3e2c4c782260ffcf456f9849b6049ca4db1e;hb=e72ffc375fce680e3419906ed3cd255a0a694f31;hp=21cd41bcbc9174a6b738486c7a046b371270a06c;hpb=cefa8cda2ba2d288ccaa4ec077a6c627592503ea;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_identity.c b/lustre/mdt/mdt_identity.c index 21cd41b..0e2a3e2 100644 --- a/lustre/mdt/mdt_identity.c +++ b/lustre/mdt/mdt_identity.c @@ -1,6 +1,4 @@ -/* -*- 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. @@ -26,8 +24,10 @@ * 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. + * + * Copyright (c) 2011, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -39,14 +39,8 @@ * Author: Fan Yong */ -#ifndef EXPORT_SYMTAB -#define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_MDS -#ifndef AUTOCONF_INCLUDED -#include -#endif #include #include #include @@ -56,7 +50,6 @@ #include #include #include -#include #include #include #include @@ -64,6 +57,7 @@ #include #include +#include #include #include #include @@ -71,7 +65,6 @@ #include #include #include -#include #include "mdt_internal.h" @@ -87,7 +80,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; } @@ -102,7 +95,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, @@ -114,46 +107,42 @@ static int mdt_identity_do_upcall(struct upcall_cache *cache, [1] = "PATH=/sbin:/usr/sbin", [2] = NULL }; - int size, rc; + struct timeval start, end; + 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); - - read_lock(&cache->uc_upcall_rwlock); - memcpy(upcall, cache->uc_upcall, size - 1); - read_unlock(&cache->uc_upcall_rwlock); - upcall[size - 1] = 0; - if (unlikely(!strcmp(upcall, "NONE"))) { + cfs_read_lock(&cache->uc_upcall_rwlock); + 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); 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; out: - OBD_FREE(upcall, size); + cfs_read_unlock(&cache->uc_upcall_rwlock); return rc; } @@ -163,7 +152,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 = NULL; struct md_perm *perms = NULL; int size, i; ENTRY; @@ -172,14 +161,16 @@ static int mdt_identity_parse_downcall(struct upcall_cache *cache, if (data->idd_ngroups > NGROUPS_MAX) RETURN(-E2BIG); - ginfo = 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); @@ -187,7 +178,8 @@ 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); + if (ginfo != NULL) + cfs_put_group_info(ginfo); RETURN(-ENOMEM); } @@ -205,7 +197,7 @@ static int mdt_identity_parse_downcall(struct upcall_cache *cache, 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); }