Index: kernel/generic/src/adt/hash_table.c
===================================================================
--- kernel/generic/src/adt/hash_table.c	(revision d1582b502edcb7bfeef771a2019538f265e7e27c)
+++ kernel/generic/src/adt/hash_table.c	(revision 5110d0a1ed08ccaa0107b3c666b72c97dacb98d1)
@@ -90,5 +90,5 @@
  */
 bool hash_table_create(hash_table_t *h, size_t init_size, size_t max_load,
-    hash_table_ops_t *op)
+    const hash_table_ops_t *op)
 {
 	assert(h);
@@ -110,8 +110,4 @@
 	h->apply_ongoing = false;
 
-	if (h->op->remove_callback == NULL) {
-		h->op->remove_callback = nop_remove_callback;
-	}
-
 	return true;
 }
@@ -171,4 +167,6 @@
 	if (h->item_cnt == 0)
 		return;
+
+	void (*remove_cb)(ht_link_t *) = h->op->remove_callback ? h->op->remove_callback : nop_remove_callback;
 
 	for (size_t idx = 0; idx < h->bucket_cnt; ++idx) {
@@ -178,5 +176,5 @@
 
 			list_remove(cur);
-			h->op->remove_callback(cur_link);
+			remove_cb(cur_link);
 		}
 	}
@@ -321,5 +319,7 @@
 			++removed;
 			list_remove(cur);
-			h->op->remove_callback(cur_link);
+
+			if (h->op->remove_callback)
+				h->op->remove_callback(cur_link);
 		}
 	}
@@ -340,5 +340,7 @@
 	list_remove(&item->link);
 	--h->item_cnt;
-	h->op->remove_callback(item);
+
+	if (h->op->remove_callback)
+		h->op->remove_callback(item);
 	shrink_if_needed(h);
 }
