Merge tag 'selinux-pr-20200803' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / security / selinux / ss / hashtab.c
index 5ee868116d7067211cd264a13d1fa799e24c2494..d9287bb4bfebbccbbbd4d628b39a23869ad99ab5 100644 (file)
@@ -7,7 +7,6 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include "hashtab.h"
 
 static struct kmem_cache *hashtab_node_cachep;
@@ -29,16 +28,10 @@ static u32 hashtab_compute_size(u32 nel)
        return nel == 0 ? 0 : roundup_pow_of_two(nel);
 }
 
-int hashtab_init(struct hashtab *h,
-                u32 (*hash_value)(struct hashtab *h, const void *key),
-                int (*keycmp)(struct hashtab *h, const void *key1,
-                              const void *key2),
-                u32 nel_hint)
+int hashtab_init(struct hashtab *h, u32 nel_hint)
 {
        h->size = hashtab_compute_size(nel_hint);
        h->nel = 0;
-       h->hash_value = hash_value;
-       h->keycmp = keycmp;
        if (!h->size)
                return 0;
 
@@ -46,63 +39,23 @@ int hashtab_init(struct hashtab *h,
        return h->htable ? 0 : -ENOMEM;
 }
 
-int hashtab_insert(struct hashtab *h, void *key, void *datum)
+int __hashtab_insert(struct hashtab *h, struct hashtab_node **dst,
+                    void *key, void *datum)
 {
-       u32 hvalue;
-       struct hashtab_node *prev, *cur, *newnode;
-
-       cond_resched();
-
-       if (!h->size || h->nel == HASHTAB_MAX_NODES)
-               return -EINVAL;
-
-       hvalue = h->hash_value(h, key);
-       prev = NULL;
-       cur = h->htable[hvalue];
-       while (cur && h->keycmp(h, key, cur->key) > 0) {
-               prev = cur;
-               cur = cur->next;
-       }
-
-       if (cur && (h->keycmp(h, key, cur->key) == 0))
-               return -EEXIST;
+       struct hashtab_node *newnode;
 
        newnode = kmem_cache_zalloc(hashtab_node_cachep, GFP_KERNEL);
        if (!newnode)
                return -ENOMEM;
        newnode->key = key;
        newnode->datum = datum;
-       if (prev) {
-               newnode->next = prev->next;
-               prev->next = newnode;
-       } else {
-               newnode->next = h->htable[hvalue];
-               h->htable[hvalue] = newnode;
-       }
+       newnode->next = *dst;
+       *dst = newnode;
 
        h->nel++;
        return 0;
 }
 
-void *hashtab_search(struct hashtab *h, const void *key)
-{
-       u32 hvalue;
-       struct hashtab_node *cur;
-
-       if (!h->size)
-               return NULL;
-
-       hvalue = h->hash_value(h, key);
-       cur = h->htable[hvalue];
-       while (cur && h->keycmp(h, key, cur->key) > 0)
-               cur = cur->next;
-
-       if (!cur || (h->keycmp(h, key, cur->key) != 0))
-               return NULL;
-
-       return cur->datum;
-}
-
 void hashtab_destroy(struct hashtab *h)
 {
        u32 i;