diff --git a/src/chunk-table.c b/src/chunk-table.c index 479c33e..28bd950 100644 --- a/src/chunk-table.c +++ b/src/chunk-table.c @@ -58,43 +58,59 @@ struct cache_entry *get_cache_entry(const b_btree *tree, ec3_chunk_id key) static int node_init(struct chunk_table *tab, struct ec3_chunk_group *n) { - memset(n, 0x0, sizeof *n); + memset(&n->g_nr_chunks, 0x0, sizeof n->g_nr_chunks); + memset(n->g_reserved, 0x0, sizeof n->g_reserved); b_i32 *children; unsigned int nr_children; switch (tab->tab_cluster_size) { case EC3_CLUSTER_4K: + memset(&n->g_4k, 0x0, sizeof n->g_4k); children = n->g_4k.g_child_offsets; - nr_children = EC3_CHUNKS_PER_GROUP_4K; + nr_children = EC3_CHUNKS_PER_GROUP_4K + 1; break; case EC3_CLUSTER_8K: + memset(&n->g_8k, 0x0, sizeof n->g_8k); children = n->g_8k.g_child_offsets; - nr_children = EC3_CHUNKS_PER_GROUP_8K; + nr_children = EC3_CHUNKS_PER_GROUP_8K + 1; break; case EC3_CLUSTER_16K: + memset(&n->g_16k, 0x0, sizeof n->g_16k); children = n->g_16k.g_child_offsets; - nr_children = EC3_CHUNKS_PER_GROUP_16K; + nr_children = EC3_CHUNKS_PER_GROUP_16K + 1; break; case EC3_CLUSTER_32K: + memset(&n->g_32k, 0x0, sizeof n->g_32k); children = n->g_32k.g_child_offsets; - nr_children = EC3_CHUNKS_PER_GROUP_32K; + nr_children = EC3_CHUNKS_PER_GROUP_32K + 1; break; case EC3_CLUSTER_64K: + memset(&n->g_64k, 0x0, sizeof n->g_64k); children = n->g_64k.g_child_offsets; - nr_children = EC3_CHUNKS_PER_GROUP_64K; + nr_children = EC3_CHUNKS_PER_GROUP_64K + 1; break; default: return -1; } + memset(children, 0xFF, nr_children * sizeof *children); +#if 0 for (unsigned int i = 0; i < nr_children; i++) { children[i] = b_i32_htob(EC3_INVALID_OFFSET); } +#endif return 0; } +static void __node_init(struct b_tree *tree, b_tree_node *n) +{ + struct chunk_table *table = (struct chunk_table *)tree; + struct ec3_chunk_group *node = (struct ec3_chunk_group *)n; + node_init(table, node); +} + static int tree_get_node(struct b_tree *p, unsigned long id, b_tree_node *n) { struct chunk_table *table = (struct chunk_table *)p; @@ -355,14 +371,22 @@ static int entry_compare( struct ec3_chunk *a = (struct ec3_chunk *)e0, *b = (struct ec3_chunk *)e1; - return memcmp(a->c_id, b->c_id, sizeof a->c_id); + int cmp = memcmp(a->c_id, b->c_id, sizeof a->c_id); + if (cmp > 0) { + return 1; + } else if (cmp < 0) { + return -1; + } else { + return 0; + } } -static const struct b_tree_ops chunk_table_ops = { +const struct b_tree_ops chunk_table_ops = { .tree_get_node = tree_get_node, .tree_put_node = tree_put_node, .tree_alloc_node = tree_alloc_node, + .node_init = __node_init, .node_get_nr_entries = node_get_nr_entries, .node_set_nr_entries = node_set_nr_entries, .node_get_entry = node_get_entry,