hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/security/selinux/ss/hashtab.h
....@@ -11,7 +11,17 @@
1111 #ifndef _SS_HASHTAB_H_
1212 #define _SS_HASHTAB_H_
1313
14
-#define HASHTAB_MAX_NODES 0xffffffff
14
+#include <linux/types.h>
15
+#include <linux/errno.h>
16
+#include <linux/sched.h>
17
+
18
+#define HASHTAB_MAX_NODES U32_MAX
19
+
20
+struct hashtab_key_params {
21
+ u32 (*hash)(const void *key); /* hash function */
22
+ int (*cmp)(const void *key1, const void *key2);
23
+ /* key comparison function */
24
+};
1525
1626 struct hashtab_node {
1727 void *key;
....@@ -23,10 +33,6 @@
2333 struct hashtab_node **htable; /* hash table */
2434 u32 size; /* number of slots in hash table */
2535 u32 nel; /* number of elements in hash table */
26
- u32 (*hash_value)(struct hashtab *h, const void *key);
27
- /* hash function */
28
- int (*keycmp)(struct hashtab *h, const void *key1, const void *key2);
29
- /* key comparison function */
3036 };
3137
3238 struct hashtab_info {
....@@ -35,14 +41,14 @@
3541 };
3642
3743 /*
38
- * Creates a new hash table with the specified characteristics.
44
+ * Initializes a new hash table with the specified characteristics.
3945 *
40
- * Returns NULL if insufficent space is available or
41
- * the new hash table otherwise.
46
+ * Returns -ENOMEM if insufficient space is available or 0 otherwise.
4247 */
43
-struct hashtab *hashtab_create(u32 (*hash_value)(struct hashtab *h, const void *key),
44
- int (*keycmp)(struct hashtab *h, const void *key1, const void *key2),
45
- u32 size);
48
+int hashtab_init(struct hashtab *h, u32 nel_hint);
49
+
50
+int __hashtab_insert(struct hashtab *h, struct hashtab_node **dst,
51
+ void *key, void *datum);
4652
4753 /*
4854 * Inserts the specified (key, datum) pair into the specified hash table.
....@@ -52,7 +58,34 @@
5258 * -EINVAL for general errors or
5359 0 otherwise.
5460 */
55
-int hashtab_insert(struct hashtab *h, void *k, void *d);
61
+static inline int hashtab_insert(struct hashtab *h, void *key, void *datum,
62
+ struct hashtab_key_params key_params)
63
+{
64
+ u32 hvalue;
65
+ struct hashtab_node *prev, *cur;
66
+
67
+ cond_resched();
68
+
69
+ if (!h->size || h->nel == HASHTAB_MAX_NODES)
70
+ return -EINVAL;
71
+
72
+ hvalue = key_params.hash(key) & (h->size - 1);
73
+ prev = NULL;
74
+ cur = h->htable[hvalue];
75
+ while (cur) {
76
+ int cmp = key_params.cmp(key, cur->key);
77
+
78
+ if (cmp == 0)
79
+ return -EEXIST;
80
+ if (cmp < 0)
81
+ break;
82
+ prev = cur;
83
+ cur = cur->next;
84
+ }
85
+
86
+ return __hashtab_insert(h, prev ? &prev->next : &h->htable[hvalue],
87
+ key, datum);
88
+}
5689
5790 /*
5891 * Searches for the entry with the specified key in the hash table.
....@@ -60,7 +93,28 @@
6093 * Returns NULL if no entry has the specified key or
6194 * the datum of the entry otherwise.
6295 */
63
-void *hashtab_search(struct hashtab *h, const void *k);
96
+static inline void *hashtab_search(struct hashtab *h, const void *key,
97
+ struct hashtab_key_params key_params)
98
+{
99
+ u32 hvalue;
100
+ struct hashtab_node *cur;
101
+
102
+ if (!h->size)
103
+ return NULL;
104
+
105
+ hvalue = key_params.hash(key) & (h->size - 1);
106
+ cur = h->htable[hvalue];
107
+ while (cur) {
108
+ int cmp = key_params.cmp(key, cur->key);
109
+
110
+ if (cmp == 0)
111
+ return cur->datum;
112
+ if (cmp < 0)
113
+ break;
114
+ cur = cur->next;
115
+ }
116
+ return NULL;
117
+}
64118
65119 /*
66120 * Destroys the specified hash table.
....@@ -82,6 +136,12 @@
82136 int (*apply)(void *k, void *d, void *args),
83137 void *args);
84138
139
+int hashtab_duplicate(struct hashtab *new, struct hashtab *orig,
140
+ int (*copy)(struct hashtab_node *new,
141
+ struct hashtab_node *orig, void *args),
142
+ int (*destroy)(void *k, void *d, void *args),
143
+ void *args);
144
+
85145 /* Fill info with some hash table statistics */
86146 void hashtab_stat(struct hashtab *h, struct hashtab_info *info);
87147