X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Flustre_handles.c;h=e4dc35591d4c510990d3d67eb31502033197a2a8;hb=cd3aa902bfcf529a6774df3a207a2c3287c994fb;hp=7a7c19f829c373c54cadc333fa3cb183af024137;hpb=9fb46705ae86aa2c0ac29427f0ff24f923560eb7;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/lustre_handles.c b/lustre/obdclass/lustre_handles.c index 7a7c19f..e4dc355 100644 --- a/lustre/obdclass/lustre_handles.c +++ b/lustre/obdclass/lustre_handles.c @@ -27,7 +27,7 @@ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, Whamcloud, Inc. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -48,11 +48,11 @@ #include #ifndef __KERNEL__ -# define list_add_rcu cfs_list_add -# define list_del_rcu cfs_list_del -# define list_for_each_rcu cfs_list_for_each -# define list_for_each_safe_rcu cfs_list_for_each_safe -# define list_for_each_entry_rcu cfs_list_for_each_entry +# define list_add_rcu list_add +# define list_del_rcu list_del +# define list_for_each_rcu list_for_each +# define list_for_each_safe_rcu list_for_each_safe +# define list_for_each_entry_rcu list_for_each_entry # define rcu_read_lock() spin_lock(&bucket->lock) # define rcu_read_unlock() spin_unlock(&bucket->lock) #endif /* !__KERNEL__ */ @@ -62,20 +62,11 @@ static __u64 handle_base; static spinlock_t handle_base_lock; static struct handle_bucket { - spinlock_t lock; - cfs_list_t head; + spinlock_t lock; + struct list_head head; } *handle_hash; -#ifdef __arch_um__ -/* For unknown reason, UML uses kmalloc rather than vmalloc to allocate - * memory(OBD_VMALLOC). Therefore, we have to redefine the - * HANDLE_HASH_SIZE to make the hash heads don't exceed 128K. - */ -#define HANDLE_HASH_SIZE 4096 -#else #define HANDLE_HASH_SIZE (1 << 16) -#endif /* ifdef __arch_um__ */ - #define HANDLE_HASH_MASK (HANDLE_HASH_SIZE - 1) /* @@ -89,7 +80,7 @@ void class_handle_hash(struct portals_handle *h, ENTRY; LASSERT(h != NULL); - LASSERT(cfs_list_empty(&h->h_link)); + LASSERT(list_empty(&h->h_link)); /* * This is fast, but simplistic cookie generation algorithm, it will @@ -98,7 +89,6 @@ void class_handle_hash(struct portals_handle *h, spin_lock(&handle_base_lock); handle_base += HANDLE_INCR; - h->h_cookie = handle_base; if (unlikely(handle_base == 0)) { /* * Cookie of zero is "dangerous", because in many places it's @@ -108,6 +98,7 @@ void class_handle_hash(struct portals_handle *h, CWARN("The universe has been exhausted: cookie wrap-around.\n"); handle_base += HANDLE_INCR; } + h->h_cookie = handle_base; spin_unlock(&handle_base_lock); h->h_ops = ops; @@ -127,7 +118,7 @@ EXPORT_SYMBOL(class_handle_hash); static void class_handle_unhash_nolock(struct portals_handle *h) { - if (cfs_list_empty(&h->h_link)) { + if (list_empty(&h->h_link)) { CERROR("removing an already-removed handle ("LPX64")\n", h->h_cookie); return; @@ -173,7 +164,7 @@ void class_handle_hash_back(struct portals_handle *h) } EXPORT_SYMBOL(class_handle_hash_back); -void *class_handle2object(__u64 cookie) +void *class_handle2object(__u64 cookie, const void *owner) { struct handle_bucket *bucket; struct portals_handle *h; @@ -188,7 +179,7 @@ void *class_handle2object(__u64 cookie) rcu_read_lock(); list_for_each_entry_rcu(h, &bucket->head, h_link) { - if (h->h_cookie != cookie) + if (h->h_cookie != cookie || h->h_owner != owner) continue; spin_lock(&h->h_lock); @@ -232,14 +223,14 @@ int class_handle_init(void) spin_lock_init(&handle_base_lock); for (bucket = handle_hash + HANDLE_HASH_SIZE - 1; bucket >= handle_hash; bucket--) { - CFS_INIT_LIST_HEAD(&bucket->head); + INIT_LIST_HEAD(&bucket->head); spin_lock_init(&bucket->lock); } - /** bug 21430: add randomness to the initial base */ - cfs_get_random_bytes(seed, sizeof(seed)); - cfs_gettimeofday(&tv); - cfs_srand(tv.tv_sec ^ seed[0], tv.tv_usec ^ seed[1]); + /** bug 21430: add randomness to the initial base */ + cfs_get_random_bytes(seed, sizeof(seed)); + do_gettimeofday(&tv); + cfs_srand(tv.tv_sec ^ seed[0], tv.tv_usec ^ seed[1]); cfs_get_random_bytes(&handle_base, sizeof(handle_base)); LASSERT(handle_base != 0ULL);