chunk-table: fix incorrect b-tree node initialisation
This commit is contained in:
@@ -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)
|
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;
|
b_i32 *children;
|
||||||
unsigned int nr_children;
|
unsigned int nr_children;
|
||||||
|
|
||||||
switch (tab->tab_cluster_size) {
|
switch (tab->tab_cluster_size) {
|
||||||
case EC3_CLUSTER_4K:
|
case EC3_CLUSTER_4K:
|
||||||
|
memset(&n->g_4k, 0x0, sizeof n->g_4k);
|
||||||
children = n->g_4k.g_child_offsets;
|
children = n->g_4k.g_child_offsets;
|
||||||
nr_children = EC3_CHUNKS_PER_GROUP_4K;
|
nr_children = EC3_CHUNKS_PER_GROUP_4K + 1;
|
||||||
break;
|
break;
|
||||||
case EC3_CLUSTER_8K:
|
case EC3_CLUSTER_8K:
|
||||||
|
memset(&n->g_8k, 0x0, sizeof n->g_8k);
|
||||||
children = n->g_8k.g_child_offsets;
|
children = n->g_8k.g_child_offsets;
|
||||||
nr_children = EC3_CHUNKS_PER_GROUP_8K;
|
nr_children = EC3_CHUNKS_PER_GROUP_8K + 1;
|
||||||
break;
|
break;
|
||||||
case EC3_CLUSTER_16K:
|
case EC3_CLUSTER_16K:
|
||||||
|
memset(&n->g_16k, 0x0, sizeof n->g_16k);
|
||||||
children = n->g_16k.g_child_offsets;
|
children = n->g_16k.g_child_offsets;
|
||||||
nr_children = EC3_CHUNKS_PER_GROUP_16K;
|
nr_children = EC3_CHUNKS_PER_GROUP_16K + 1;
|
||||||
break;
|
break;
|
||||||
case EC3_CLUSTER_32K:
|
case EC3_CLUSTER_32K:
|
||||||
|
memset(&n->g_32k, 0x0, sizeof n->g_32k);
|
||||||
children = n->g_32k.g_child_offsets;
|
children = n->g_32k.g_child_offsets;
|
||||||
nr_children = EC3_CHUNKS_PER_GROUP_32K;
|
nr_children = EC3_CHUNKS_PER_GROUP_32K + 1;
|
||||||
break;
|
break;
|
||||||
case EC3_CLUSTER_64K:
|
case EC3_CLUSTER_64K:
|
||||||
|
memset(&n->g_64k, 0x0, sizeof n->g_64k);
|
||||||
children = n->g_64k.g_child_offsets;
|
children = n->g_64k.g_child_offsets;
|
||||||
nr_children = EC3_CHUNKS_PER_GROUP_64K;
|
nr_children = EC3_CHUNKS_PER_GROUP_64K + 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(children, 0xFF, nr_children * sizeof *children);
|
||||||
|
#if 0
|
||||||
for (unsigned int i = 0; i < nr_children; i++) {
|
for (unsigned int i = 0; i < nr_children; i++) {
|
||||||
children[i] = b_i32_htob(EC3_INVALID_OFFSET);
|
children[i] = b_i32_htob(EC3_INVALID_OFFSET);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
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)
|
static int tree_get_node(struct b_tree *p, unsigned long id, b_tree_node *n)
|
||||||
{
|
{
|
||||||
struct chunk_table *table = (struct chunk_table *)p;
|
struct chunk_table *table = (struct chunk_table *)p;
|
||||||
@@ -355,14 +371,22 @@ static int entry_compare(
|
|||||||
struct ec3_chunk *a = (struct ec3_chunk *)e0,
|
struct ec3_chunk *a = (struct ec3_chunk *)e0,
|
||||||
*b = (struct ec3_chunk *)e1;
|
*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_get_node = tree_get_node,
|
||||||
.tree_put_node = tree_put_node,
|
.tree_put_node = tree_put_node,
|
||||||
.tree_alloc_node = tree_alloc_node,
|
.tree_alloc_node = tree_alloc_node,
|
||||||
|
|
||||||
|
.node_init = __node_init,
|
||||||
.node_get_nr_entries = node_get_nr_entries,
|
.node_get_nr_entries = node_get_nr_entries,
|
||||||
.node_set_nr_entries = node_set_nr_entries,
|
.node_set_nr_entries = node_set_nr_entries,
|
||||||
.node_get_entry = node_get_entry,
|
.node_get_entry = node_get_entry,
|
||||||
|
|||||||
Reference in New Issue
Block a user