X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Fremote_perm.c;h=07381826e818c92c4afbfe62395825b37d279bd1;hb=b2771e3d9e589e1a347b796eb97211bcdf0a40e1;hp=9d26e870172bad757596387f7bfbd78259e9fa9d;hpb=6e3ec5812ebd1b5ecf7cae584f429b013ffe7431;p=fs%2Flustre-release.git diff --git a/lustre/llite/remote_perm.c b/lustre/llite/remote_perm.c index 9d26e87..0738182 100644 --- a/lustre/llite/remote_perm.c +++ b/lustre/llite/remote_perm.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) 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -45,7 +45,6 @@ #include #include -#include #include #include @@ -56,17 +55,17 @@ #include #include "llite_internal.h" -cfs_mem_cache_t *ll_remote_perm_cachep = NULL; -cfs_mem_cache_t *ll_rmtperm_hash_cachep = NULL; +struct kmem_cache *ll_remote_perm_cachep; +struct kmem_cache *ll_rmtperm_hash_cachep; static inline struct ll_remote_perm *alloc_ll_remote_perm(void) { - struct ll_remote_perm *lrp; + struct ll_remote_perm *lrp; - OBD_SLAB_ALLOC_PTR_GFP(lrp, ll_remote_perm_cachep, GFP_KERNEL); - if (lrp) - CFS_INIT_HLIST_NODE(&lrp->lrp_list); - return lrp; + OBD_SLAB_ALLOC_PTR_GFP(lrp, ll_remote_perm_cachep, GFP_KERNEL); + if (lrp) + INIT_HLIST_NODE(&lrp->lrp_list); + return lrp; } static inline void free_ll_remote_perm(struct ll_remote_perm *lrp) @@ -74,33 +73,34 @@ static inline void free_ll_remote_perm(struct ll_remote_perm *lrp) if (!lrp) return; - if (!cfs_hlist_unhashed(&lrp->lrp_list)) - cfs_hlist_del(&lrp->lrp_list); + if (!hlist_unhashed(&lrp->lrp_list)) + hlist_del(&lrp->lrp_list); OBD_SLAB_FREE(lrp, ll_remote_perm_cachep, sizeof(*lrp)); } -cfs_hlist_head_t *alloc_rmtperm_hash(void) +static struct hlist_head *alloc_rmtperm_hash(void) { - cfs_hlist_head_t *hash; + struct hlist_head *hash; int i; - OBD_SLAB_ALLOC(hash, ll_rmtperm_hash_cachep, GFP_KERNEL, - REMOTE_PERM_HASHSIZE * sizeof(*hash)); - + OBD_SLAB_ALLOC_GFP(hash, ll_rmtperm_hash_cachep, + REMOTE_PERM_HASHSIZE * sizeof(*hash), + GFP_IOFS); if (!hash) return NULL; for (i = 0; i < REMOTE_PERM_HASHSIZE; i++) - CFS_INIT_HLIST_HEAD(hash + i); + INIT_HLIST_HEAD(hash + i); return hash; } -void free_rmtperm_hash(cfs_hlist_head_t *hash) +void free_rmtperm_hash(struct hlist_head *hash) { - int i; - struct ll_remote_perm *lrp; - cfs_hlist_node_t *node, *next; + int i; + struct ll_remote_perm *lrp; + struct hlist_node __maybe_unused *node; + struct hlist_node *next; if(!hash) return; @@ -122,30 +122,31 @@ static inline int remote_perm_hashfunc(uid_t uid) * MDT when client get remote permission. */ static int do_check_remote_perm(struct ll_inode_info *lli, int mask) { - cfs_hlist_head_t *head; - struct ll_remote_perm *lrp; - cfs_hlist_node_t *node; - int found = 0, rc; - ENTRY; - - if (!lli->lli_remote_perms) - RETURN(-ENOENT); - - head = lli->lli_remote_perms + remote_perm_hashfunc(current->uid); - - cfs_spin_lock(&lli->lli_lock); - cfs_hlist_for_each_entry(lrp, node, head, lrp_list) { - if (lrp->lrp_uid != current->uid) - continue; - if (lrp->lrp_gid != current->gid) - continue; - if (lrp->lrp_fsuid != current->fsuid) - continue; - if (lrp->lrp_fsgid != current->fsgid) - continue; - found = 1; - break; - } + struct hlist_head *head; + struct ll_remote_perm *lrp; + struct hlist_node __maybe_unused *node; + int found = 0, rc; + ENTRY; + + if (!lli->lli_remote_perms) + RETURN(-ENOENT); + + head = lli->lli_remote_perms + + remote_perm_hashfunc(from_kuid(&init_user_ns, current_uid())); + + spin_lock(&lli->lli_lock); + cfs_hlist_for_each_entry(lrp, node, head, lrp_list) { + if (lrp->lrp_uid != from_kuid(&init_user_ns, current_uid())) + continue; + if (lrp->lrp_gid != from_kgid(&init_user_ns, current_gid())) + continue; + if (lrp->lrp_fsuid != from_kuid(&init_user_ns, current_fsuid())) + continue; + if (lrp->lrp_fsgid != from_kgid(&init_user_ns, current_fsgid())) + continue; + found = 1; + break; + } if (!found) GOTO(out, rc = -ENOENT); @@ -156,17 +157,17 @@ static int do_check_remote_perm(struct ll_inode_info *lli, int mask) rc = ((lrp->lrp_access_perm & mask) == mask) ? 0 : -EACCES; out: - cfs_spin_unlock(&lli->lli_lock); - return rc; + spin_unlock(&lli->lli_lock); + return rc; } int ll_update_remote_perm(struct inode *inode, struct mdt_remote_perm *perm) { - struct ll_inode_info *lli = ll_i2info(inode); - struct ll_remote_perm *lrp = NULL, *tmp = NULL; - cfs_hlist_head_t *head, *perm_hash = NULL; - cfs_hlist_node_t *node; - ENTRY; + struct ll_inode_info *lli = ll_i2info(inode); + struct ll_remote_perm *lrp = NULL, *tmp = NULL; + struct hlist_head *head, *perm_hash = NULL; + struct hlist_node __maybe_unused *node; + ENTRY; LASSERT(ll_i2sbi(inode)->ll_flags & LL_SBI_RMT_CLIENT); @@ -193,7 +194,7 @@ int ll_update_remote_perm(struct inode *inode, struct mdt_remote_perm *perm) } } - cfs_spin_lock(&lli->lli_lock); + spin_lock(&lli->lli_lock); if (!lli->lli_remote_perms) lli->lli_remote_perms = perm_hash; @@ -218,16 +219,16 @@ again: break; } - if (!lrp) { - cfs_spin_unlock(&lli->lli_lock); - lrp = alloc_ll_remote_perm(); - if (!lrp) { - CERROR("alloc memory for ll_remote_perm failed!\n"); - RETURN(-ENOMEM); - } - cfs_spin_lock(&lli->lli_lock); - goto again; - } + if (!lrp) { + spin_unlock(&lli->lli_lock); + lrp = alloc_ll_remote_perm(); + if (!lrp) { + CERROR("alloc memory for ll_remote_perm failed!\n"); + RETURN(-ENOMEM); + } + spin_lock(&lli->lli_lock); + goto again; + } lrp->lrp_access_perm = perm->rp_access_perm; if (lrp != tmp) { @@ -235,10 +236,10 @@ again: lrp->lrp_gid = perm->rp_gid; lrp->lrp_fsuid = perm->rp_fsuid; lrp->lrp_fsgid = perm->rp_fsgid; - cfs_hlist_add_head(&lrp->lrp_list, head); + hlist_add_head(&lrp->lrp_list, head); } - lli->lli_rmtperm_utime = jiffies; - cfs_spin_unlock(&lli->lli_lock); + lli->lli_rmtperm_time = cfs_time_current(); + spin_unlock(&lli->lli_lock); CDEBUG(D_SEC, "new remote perm@%p: %u/%u/%u/%u - %#x\n", lrp, lrp->lrp_uid, lrp->lrp_gid, lrp->lrp_fsuid, lrp->lrp_fsgid, @@ -254,27 +255,27 @@ int lustre_check_remote_perm(struct inode *inode, int mask) struct ptlrpc_request *req = NULL; struct mdt_remote_perm *perm; struct obd_capa *oc; - unsigned long utime; + cfs_time_t save; int i = 0, rc; ENTRY; - do { - utime = lli->lli_rmtperm_utime; - rc = do_check_remote_perm(lli, mask); - if (!rc || (rc != -ENOENT && i)) - break; + do { + save = lli->lli_rmtperm_time; + rc = do_check_remote_perm(lli, mask); + if (!rc || (rc != -ENOENT && i)) + break; - cfs_might_sleep(); + might_sleep(); - cfs_down(&lli->lli_rmtperm_sem); - /* check again */ - if (utime != lli->lli_rmtperm_utime) { - rc = do_check_remote_perm(lli, mask); - if (!rc || (rc != -ENOENT && i)) { - cfs_up(&lli->lli_rmtperm_sem); - break; - } - } + mutex_lock(&lli->lli_rmtperm_mutex); + /* check again */ + if (save != lli->lli_rmtperm_time) { + rc = do_check_remote_perm(lli, mask); + if (!rc || (rc != -ENOENT && i)) { + mutex_unlock(&lli->lli_rmtperm_mutex); + break; + } + } if (i++ > 5) { CERROR("check remote perm falls in dead loop!\n"); @@ -286,20 +287,20 @@ int lustre_check_remote_perm(struct inode *inode, int mask) ll_i2suppgid(inode), &req); capa_put(oc); if (rc) { - cfs_up(&lli->lli_rmtperm_sem); + mutex_unlock(&lli->lli_rmtperm_mutex); break; } perm = req_capsule_server_swab_get(&req->rq_pill, &RMF_ACL, lustre_swab_mdt_remote_perm); if (unlikely(perm == NULL)) { - cfs_up(&lli->lli_rmtperm_sem); + mutex_unlock(&lli->lli_rmtperm_mutex); rc = -EPROTO; break; } rc = ll_update_remote_perm(inode, perm); - cfs_up(&lli->lli_rmtperm_sem); + mutex_unlock(&lli->lli_rmtperm_mutex); if (rc == -ENOMEM) break; @@ -309,28 +310,3 @@ int lustre_check_remote_perm(struct inode *inode, int mask) ptlrpc_req_finished(req); RETURN(rc); } - -#if 0 /* NB: remote perms can't be freed in ll_mdc_blocking_ast of UPDATE lock, - * because it will fail sanity test 48. - */ -void ll_free_remote_perms(struct inode *inode) -{ - struct ll_inode_info *lli = ll_i2info(inode); - cfs_hlist_head_t *hash = lli->lli_remote_perms; - struct ll_remote_perm *lrp; - cfs_hlist_node_t *node, *next; - int i; - - LASSERT(hash); - - cfs_spin_lock(&lli->lli_lock); - - for (i = 0; i < REMOTE_PERM_HASHSIZE; i++) { - cfs_hlist_for_each_entry_safe(lrp, node, next, hash + i, - lrp_list) - free_ll_remote_perm(lrp); - } - - cfs_spin_unlock(&lli->lli_lock); -} -#endif