X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_identity.c;h=e7e76b0d4483de8b51bca795d574a9555a460cd0;hb=2de8f60b9ca1c8e281235857d902d1f2a599c4b5;hp=434ddbd985372cc24631f9bf1c58bcdb7a7c4293;hpb=c7139b228b5294b1e9f4f52a4c6565c06d17b4af;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_identity.c b/lustre/mdt/mdt_identity.c index 434ddbd..e7e76b0 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. @@ -28,6 +26,8 @@ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, 2012, Intel Corporation. */ /* * 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" @@ -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, @@ -115,32 +108,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"))) { + 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); @@ -158,7 +142,7 @@ static int mdt_identity_do_upcall(struct upcall_cache *cache, } EXIT; out: - OBD_FREE(upcall, size); + read_unlock(&cache->uc_upcall_rwlock); return rc; } @@ -168,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; - cfs_group_info_t *ginfo; + cfs_group_info_t *ginfo = NULL; struct md_perm *perms = NULL; int size, i; ENTRY; @@ -177,14 +161,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 +178,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); } @@ -210,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); } @@ -290,7 +277,7 @@ __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 md_ucred *uc = mdt_ucred(info); + struct lu_ucred *uc = mdt_ucred_check(info); struct md_object *next = mdt_object_child(o); struct mdt_remote_perm *perm = buf; @@ -302,13 +289,13 @@ int mdt_pack_remote_perm(struct mdt_thread_info *info, struct mdt_object *o, if (!exp_connect_rmtclient(info->mti_exp)) RETURN(-EBADE); - if ((uc->mu_valid != UCRED_OLD) && (uc->mu_valid != UCRED_NEW)) - RETURN(-EINVAL); + if (uc == NULL) + RETURN(-EINVAL); - perm->rp_uid = uc->mu_o_uid; - perm->rp_gid = uc->mu_o_gid; - perm->rp_fsuid = uc->mu_o_fsuid; - perm->rp_fsgid = uc->mu_o_fsgid; + perm->rp_uid = uc->uc_o_uid; + perm->rp_gid = uc->uc_o_gid; + perm->rp_fsuid = uc->uc_o_fsuid; + perm->rp_fsgid = uc->uc_o_fsgid; perm->rp_access_perm = 0; if (mo_permission(info->mti_env, NULL, next, NULL, MAY_READ) == 0)