===================================================================
@@ -359,7 +359,11 @@ struct dm_exception_table_internal {
* some consecutive chunks to be grouped together.
*/
static struct dm_exception_table *
-dm_exception_table_create(uint32_t size, unsigned hash_shift)
+dm_exception_table_create(uint32_t size, unsigned hash_shift,
+ struct dm_exception *(*alloc_exception)(void *),
+ void *alloc_context,
+ void (*free_exception)(struct dm_exception *e, void *),
+ void *free_context)
{
unsigned int i;
struct dm_exception_table_internal *eti;
@@ -379,14 +383,18 @@ dm_exception_table_create(uint32_t size,
return NULL;
}
+ eti->alloc_exception = alloc_exception;
+ eti->alloc_context = alloc_context;
+ eti->free_exception = free_exception;
+ eti->free_context = free_context;
+
for (i = 0; i < size; i++)
INIT_LIST_HEAD(et->table + i);
return et;
}
-static void dm_exception_table_destroy(struct dm_exception_table *et,
- struct kmem_cache *mem)
+static void dm_exception_table_destroy(struct dm_exception_table *et)
{
struct dm_exception_table_internal *eti;
struct list_head *slot;
@@ -400,7 +408,7 @@ static void dm_exception_table_destroy(s
slot = et->table + i;
list_for_each_entry_safe (ex, next, slot, hash_list)
- kmem_cache_free(mem, ex);
+ eti->free_exception(ex, eti->free_context);
}
vfree(et->table);
@@ -575,7 +583,9 @@ static int init_hash_tables(struct dm_sn
hash_size = rounddown_pow_of_two(hash_size);
s->complete = dm_exception_table_create(hash_size,
- DM_CHUNK_CONSECUTIVE_BITS);
+ DM_CHUNK_CONSECUTIVE_BITS,
+ alloc_completed_exception, NULL,
+ free_completed_exception, NULL);
if (!s->complete)
return -ENOMEM;
@@ -587,9 +597,11 @@ static int init_hash_tables(struct dm_sn
if (hash_size < 64)
hash_size = 64;
- s->pending = dm_exception_table_create(hash_size, 0);
+ s->pending = dm_exception_table_create(hash_size, 0,
+ alloc_pending_exception, s,
+ free_pending_exception, NULL);
if (!s->pending) {
- dm_exception_table_destroy(s->complete, exception_cache);
+ dm_exception_table_destroy(s->complete);
return -ENOMEM;
}
@@ -781,8 +793,8 @@ bad_pending_pool:
dm_kcopyd_client_destroy(s->kcopyd_client);
bad_kcopyd:
- dm_exception_table_destroy(s->pending, pending_cache);
- dm_exception_table_destroy(s->complete, exception_cache);
+ dm_exception_table_destroy(s->pending);
+ dm_exception_table_destroy(s->complete);
bad_hash_tables:
dm_put_device(ti, s->origin);
@@ -801,8 +813,8 @@ static void __free_exceptions(struct dm_
dm_kcopyd_client_destroy(s->kcopyd_client);
s->kcopyd_client = NULL;
- dm_exception_table_destroy(s->pending, pending_cache);
- dm_exception_table_destroy(s->complete, exception_cache);
+ dm_exception_table_destroy(s->pending);
+ dm_exception_table_destroy(s->complete);
}
static void snapshot_dtr(struct dm_target *ti)