Whamcloud - gitweb
LU-506 kernel: FC15 - reiserfs remove & cleanup
[fs/lustre-release.git] / libcfs / libcfs / hash.c
index 738e4f9..2c6df47 100644 (file)
 #include <libcfs/libcfs.h>
 
 #if CFS_HASH_DEBUG_LEVEL >= CFS_HASH_DEBUG_1
-static unsigned int warn_on_depth = 0;
+static unsigned int warn_on_depth = 8;
 CFS_MODULE_PARM(warn_on_depth, "i", uint, 0644,
                 "warning when hash depth is high.");
 #endif
@@ -467,7 +467,7 @@ cfs_hash_hlist_setup(cfs_hash_t *hs)
 
 static void
 cfs_hash_bd_from_key(cfs_hash_t *hs, cfs_hash_bucket_t **bkts,
-                     unsigned int bits, void *key, cfs_hash_bd_t *bd)
+                     unsigned int bits, const void *key, cfs_hash_bd_t *bd)
 {
         unsigned int index = cfs_hash_id(hs, key, (1U << bits) - 1);
 
@@ -478,7 +478,7 @@ cfs_hash_bd_from_key(cfs_hash_t *hs, cfs_hash_bucket_t **bkts,
 }
 
 void
-cfs_hash_bd_get(cfs_hash_t *hs, void *key, cfs_hash_bd_t *bd)
+cfs_hash_bd_get(cfs_hash_t *hs, const void *key, cfs_hash_bd_t *bd)
 {
         /* NB: caller should hold hs->hs_rwlock if REHASH is set */
         if (likely(hs->hs_rehash_buckets == NULL)) {
@@ -615,7 +615,7 @@ typedef enum cfs_hash_lookup_intent {
 
 static cfs_hlist_node_t *
 cfs_hash_bd_lookup_intent(cfs_hash_t *hs, cfs_hash_bd_t *bd,
-                          void *key, cfs_hlist_node_t *hnode,
+                          const void *key, cfs_hlist_node_t *hnode,
                           cfs_hash_lookup_intent_t intent)
 
 {
@@ -655,7 +655,7 @@ cfs_hash_bd_lookup_intent(cfs_hash_t *hs, cfs_hash_bd_t *bd,
 }
 
 cfs_hlist_node_t *
-cfs_hash_bd_lookup_locked(cfs_hash_t *hs, cfs_hash_bd_t *bd, void *key)
+cfs_hash_bd_lookup_locked(cfs_hash_t *hs, cfs_hash_bd_t *bd, const void *key)
 {
         return cfs_hash_bd_lookup_intent(hs, bd, key, NULL,
                                          CFS_HS_LOOKUP_IT_FIND);
@@ -664,7 +664,7 @@ CFS_EXPORT_SYMBOL(cfs_hash_bd_lookup_locked);
 
 cfs_hlist_node_t *
 cfs_hash_bd_findadd_locked(cfs_hash_t *hs, cfs_hash_bd_t *bd,
-                           void *key, cfs_hlist_node_t *hnode,
+                           const void *key, cfs_hlist_node_t *hnode,
                            int noref)
 {
         return cfs_hash_bd_lookup_intent(hs, bd, key, hnode,
@@ -675,7 +675,7 @@ CFS_EXPORT_SYMBOL(cfs_hash_bd_findadd_locked);
 
 cfs_hlist_node_t *
 cfs_hash_bd_finddel_locked(cfs_hash_t *hs, cfs_hash_bd_t *bd,
-                           void *key, cfs_hlist_node_t *hnode)
+                           const void *key, cfs_hlist_node_t *hnode)
 {
         /* hnode can be NULL, we find the first item with @key */
         return cfs_hash_bd_lookup_intent(hs, bd, key, hnode,
@@ -723,7 +723,7 @@ cfs_hash_multi_bd_unlock(cfs_hash_t *hs, cfs_hash_bd_t *bds,
 
 static cfs_hlist_node_t *
 cfs_hash_multi_bd_lookup_locked(cfs_hash_t *hs, cfs_hash_bd_t *bds,
-                                unsigned n, void *key)
+                                unsigned n, const void *key)
 {
         cfs_hlist_node_t  *ehnode;
         unsigned           i;
@@ -739,7 +739,7 @@ cfs_hash_multi_bd_lookup_locked(cfs_hash_t *hs, cfs_hash_bd_t *bds,
 
 static cfs_hlist_node_t *
 cfs_hash_multi_bd_findadd_locked(cfs_hash_t *hs,
-                                 cfs_hash_bd_t *bds, unsigned n, void *key,
+                                 cfs_hash_bd_t *bds, unsigned n, const void *key,
                                  cfs_hlist_node_t *hnode, int noref)
 {
         cfs_hlist_node_t  *ehnode;
@@ -770,7 +770,8 @@ cfs_hash_multi_bd_findadd_locked(cfs_hash_t *hs,
 
 static cfs_hlist_node_t *
 cfs_hash_multi_bd_finddel_locked(cfs_hash_t *hs, cfs_hash_bd_t *bds,
-                                 unsigned n, void *key, cfs_hlist_node_t *hnode)
+                                 unsigned n, const void *key,
+                                 cfs_hlist_node_t *hnode)
 {
         cfs_hlist_node_t  *ehnode;
         unsigned           i;
@@ -812,7 +813,7 @@ cfs_hash_bd_order(cfs_hash_bd_t *bd1, cfs_hash_bd_t *bd2)
 }
 
 void
-cfs_hash_dual_bd_get(cfs_hash_t *hs, void *key, cfs_hash_bd_t *bds)
+cfs_hash_dual_bd_get(cfs_hash_t *hs, const void *key, cfs_hash_bd_t *bds)
 {
         /* NB: caller should hold hs_lock.rw if REHASH is set */
         cfs_hash_bd_from_key(hs, hs->hs_buckets,
@@ -846,7 +847,8 @@ cfs_hash_dual_bd_unlock(cfs_hash_t *hs, cfs_hash_bd_t *bds, int excl)
 CFS_EXPORT_SYMBOL(cfs_hash_dual_bd_unlock);
 
 cfs_hlist_node_t *
-cfs_hash_dual_bd_lookup_locked(cfs_hash_t *hs, cfs_hash_bd_t *bds, void *key)
+cfs_hash_dual_bd_lookup_locked(cfs_hash_t *hs, cfs_hash_bd_t *bds,
+                               const void *key)
 {
         return cfs_hash_multi_bd_lookup_locked(hs, bds, 2, key);
 }
@@ -854,7 +856,7 @@ CFS_EXPORT_SYMBOL(cfs_hash_dual_bd_lookup_locked);
 
 cfs_hlist_node_t *
 cfs_hash_dual_bd_findadd_locked(cfs_hash_t *hs, cfs_hash_bd_t *bds,
-                                void *key, cfs_hlist_node_t *hnode,
+                                const void *key, cfs_hlist_node_t *hnode,
                                 int noref)
 {
         return cfs_hash_multi_bd_findadd_locked(hs, bds, 2, key,
@@ -864,7 +866,7 @@ CFS_EXPORT_SYMBOL(cfs_hash_dual_bd_findadd_locked);
 
 cfs_hlist_node_t *
 cfs_hash_dual_bd_finddel_locked(cfs_hash_t *hs, cfs_hash_bd_t *bds,
-                                void *key, cfs_hlist_node_t *hnode)
+                                const void *key, cfs_hlist_node_t *hnode)
 {
         return cfs_hash_multi_bd_finddel_locked(hs, bds, 2, key, hnode);
 }
@@ -1209,7 +1211,7 @@ cfs_hash_rehash_inline(cfs_hash_t *hs)
  * ops->hs_get function will be called when the item is added.
  */
 void
-cfs_hash_add(cfs_hash_t *hs, void *key, cfs_hlist_node_t *hnode)
+cfs_hash_add(cfs_hash_t *hs, const void *key, cfs_hlist_node_t *hnode)
 {
         cfs_hash_bd_t   bd;
         int             bits;
@@ -1232,7 +1234,7 @@ cfs_hash_add(cfs_hash_t *hs, void *key, cfs_hlist_node_t *hnode)
 CFS_EXPORT_SYMBOL(cfs_hash_add);
 
 static cfs_hlist_node_t *
-cfs_hash_find_or_add(cfs_hash_t *hs, void *key,
+cfs_hash_find_or_add(cfs_hash_t *hs, const void *key,
                      cfs_hlist_node_t *hnode, int noref)
 {
         cfs_hlist_node_t *ehnode;
@@ -1264,10 +1266,10 @@ cfs_hash_find_or_add(cfs_hash_t *hs, void *key,
  * Returns 0 on success or -EALREADY on key collisions.
  */
 int
-cfs_hash_add_unique(cfs_hash_t *hs, void *key, cfs_hlist_node_t *hnode)
+cfs_hash_add_unique(cfs_hash_t *hs, const void *key, cfs_hlist_node_t *hnode)
 {
-        RETURN(cfs_hash_find_or_add(hs, key, hnode, 1) != hnode ?
-               -EALREADY : 0);
+        return cfs_hash_find_or_add(hs, key, hnode, 1) != hnode ?
+               -EALREADY : 0;
 }
 CFS_EXPORT_SYMBOL(cfs_hash_add_unique);
 
@@ -1278,7 +1280,7 @@ CFS_EXPORT_SYMBOL(cfs_hash_add_unique);
  * Otherwise ops->hs_get is called on the item which was added.
  */
 void *
-cfs_hash_findadd_unique(cfs_hash_t *hs, void *key,
+cfs_hash_findadd_unique(cfs_hash_t *hs, const void *key,
                         cfs_hlist_node_t *hnode)
 {
         hnode = cfs_hash_find_or_add(hs, key, hnode, 0);
@@ -1295,7 +1297,7 @@ CFS_EXPORT_SYMBOL(cfs_hash_findadd_unique);
  * on the removed object.
  */
 void *
-cfs_hash_del(cfs_hash_t *hs, void *key, cfs_hlist_node_t *hnode)
+cfs_hash_del(cfs_hash_t *hs, const void *key, cfs_hlist_node_t *hnode)
 {
         void           *obj  = NULL;
         int             bits = 0;
@@ -1330,7 +1332,7 @@ CFS_EXPORT_SYMBOL(cfs_hash_del);
  * will be returned and ops->hs_put is called on the removed object.
  */
 void *
-cfs_hash_del_key(cfs_hash_t *hs, void *key)
+cfs_hash_del_key(cfs_hash_t *hs, const void *key)
 {
         return cfs_hash_del(hs, key, NULL);
 }
@@ -1345,7 +1347,7 @@ CFS_EXPORT_SYMBOL(cfs_hash_del_key);
  * in the hash @hs NULL is returned.
  */
 void *
-cfs_hash_lookup(cfs_hash_t *hs, void *key)
+cfs_hash_lookup(cfs_hash_t *hs, const void *key)
 {
         void                 *obj = NULL;
         cfs_hlist_node_t     *hnode;
@@ -1572,7 +1574,6 @@ cfs_hash_for_each_relax(cfs_hash_t *hs, cfs_hash_for_each_cb_t func, void *data)
 {
         cfs_hlist_node_t *hnode;
         cfs_hlist_node_t *tmp;
-        void             *obj;
         cfs_hash_bd_t     bd;
         __u32             version;
         int               count = 0;
@@ -1596,13 +1597,13 @@ cfs_hash_for_each_relax(cfs_hash_t *hs, cfs_hash_for_each_cb_t func, void *data)
                 cfs_hash_bd_for_each_hlist(hs, &bd, hhead) {
                         for (hnode = hhead->first; hnode != NULL;) {
                                 cfs_hash_bucket_validate(hs, &bd, hnode);
-                                obj = cfs_hash_get(hs, hnode);
+                                cfs_hash_get(hs, hnode);
                                 cfs_hash_bd_unlock(hs, &bd, 0);
                                 cfs_hash_unlock(hs, 0);
 
                                 rc = func(hs, &bd, hnode, data);
                                 if (stop_on_change)
-                                        (void)cfs_hash_put(hs, hnode);
+                                        cfs_hash_put(hs, hnode);
                                 cfs_cond_resched();
                                 count++;
 
@@ -1697,15 +1698,13 @@ cfs_hash_hlist_for_each(cfs_hash_t *hs, unsigned hindex,
         cfs_hlist_head_t   *hhead;
         cfs_hlist_node_t   *hnode;
         cfs_hash_bd_t       bd;
-        ENTRY;
 
         cfs_hash_for_each_enter(hs);
         cfs_hash_lock(hs, 0);
         if (hindex >= CFS_HASH_NHLIST(hs))
                 goto out;
 
-        bd.bd_bucket = hs->hs_buckets[hindex >> hs->hs_bkt_bits];
-        bd.bd_offset = hindex & (CFS_HASH_BKT_NHLIST(hs) - 1);
+        cfs_hash_bd_index_set(hs, hindex, &bd);
 
         cfs_hash_bd_lock(hs, &bd, 0);
         hhead = cfs_hash_bd_hhead(hs, &bd);
@@ -1717,7 +1716,6 @@ cfs_hash_hlist_for_each(cfs_hash_t *hs, unsigned hindex,
  out:
         cfs_hash_unlock(hs, 0);
         cfs_hash_for_each_exit(hs);
-        EXIT;
 }
 
 CFS_EXPORT_SYMBOL(cfs_hash_hlist_for_each);
@@ -1729,13 +1727,12 @@ CFS_EXPORT_SYMBOL(cfs_hash_hlist_for_each);
  * is held so the callback must never sleep.
    */
 void
-cfs_hash_for_each_key(cfs_hash_t *hs, void *key,
+cfs_hash_for_each_key(cfs_hash_t *hs, const void *key,
                       cfs_hash_for_each_cb_t func, void *data)
 {
         cfs_hlist_node_t   *hnode;
         cfs_hash_bd_t       bds[2];
         unsigned            i;
-        ENTRY;
 
         cfs_hash_lock(hs, 0);
 
@@ -1756,8 +1753,6 @@ cfs_hash_for_each_key(cfs_hash_t *hs, void *key,
 
         cfs_hash_dual_bd_unlock(hs, bds, 0);
         cfs_hash_unlock(hs, 0);
-
-        EXIT;
 }
 CFS_EXPORT_SYMBOL(cfs_hash_for_each_key);
 
@@ -1814,7 +1809,6 @@ int
 cfs_hash_rehash(cfs_hash_t *hs, int do_rehash)
 {
         int     rc;
-        ENTRY;
 
         LASSERT(cfs_hash_with_rehash(hs) && !cfs_hash_with_no_lock(hs));
 
@@ -1884,7 +1878,6 @@ cfs_hash_rehash_worker(cfs_workitem_t *wi)
         int                 count = 0;
         int                 rc = 0;
         int                 i;
-        ENTRY;
 
         LASSERT (hs != NULL && cfs_hash_with_rehash(hs));
 
@@ -1970,7 +1963,7 @@ cfs_hash_rehash_worker(cfs_workitem_t *wi)
         if (rc != 0)
                 CDEBUG(D_INFO, "early quit of of rehashing: %d\n", rc);
         /* cfs_workitem require us to always return 0 */
-        RETURN(0);
+        return 0;
 }
 
 /**
@@ -1983,7 +1976,7 @@ cfs_hash_rehash_worker(cfs_workitem_t *wi)
  * the registered cfs_hash_get() and cfs_hash_put() functions will
  * not be called.
  */
-void cfs_hash_rehash_key(cfs_hash_t *hs, void *old_key,
+void cfs_hash_rehash_key(cfs_hash_t *hs, const void *old_key,
                          void *new_key, cfs_hlist_node_t *hnode)
 {
         cfs_hash_bd_t        bds[3];