volume: fix incorrect vnode group initialisation
This commit is contained in:
30
src/volume.c
30
src/volume.c
@@ -20,39 +20,43 @@ static size_t nr_vnode_table_orders
|
||||
|
||||
static int node_init(struct ec3_volume *volume, struct ec3_vnode_group *n)
|
||||
{
|
||||
memset(n, 0x0, sizeof *n);
|
||||
memset(&n->g_nr_vnodes, 0x0, sizeof n->g_nr_vnodes);
|
||||
memset(n->g_reserved, 0x0, sizeof n->g_reserved);
|
||||
|
||||
b_i32 *children;
|
||||
unsigned int nr_children;
|
||||
|
||||
switch (volume->v_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_VNODES_PER_GROUP_4K;
|
||||
nr_children = EC3_VNODES_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_VNODES_PER_GROUP_8K;
|
||||
nr_children = EC3_VNODES_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_VNODES_PER_GROUP_16K;
|
||||
nr_children = EC3_VNODES_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_VNODES_PER_GROUP_32K;
|
||||
nr_children = EC3_VNODES_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_VNODES_PER_GROUP_64K;
|
||||
nr_children = EC3_VNODES_PER_GROUP_64K + 1;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < nr_children; i++) {
|
||||
children[i] = b_i32_htob(EC3_INVALID_OFFSET);
|
||||
}
|
||||
memset(children, 0xFF, nr_children * sizeof *children);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -127,6 +131,13 @@ static long tree_alloc_node(struct b_tree *p)
|
||||
return (long)nr_clusters;
|
||||
}
|
||||
|
||||
static void __node_init(struct b_tree *tree, b_tree_node *n)
|
||||
{
|
||||
struct ec3_volume *volume = (struct ec3_volume *)tree;
|
||||
struct ec3_vnode_group *node = (struct ec3_vnode_group *)n;
|
||||
node_init(volume, node);
|
||||
}
|
||||
|
||||
static unsigned long node_get_nr_entries(struct b_tree *tree, b_tree_node *n)
|
||||
{
|
||||
struct ec3_vnode_group *node = (struct ec3_vnode_group *)n;
|
||||
@@ -336,6 +347,7 @@ static const struct b_tree_ops vnode_table_ops = {
|
||||
.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,
|
||||
|
||||
Reference in New Issue
Block a user