diff --git a/src/volume.c b/src/volume.c index e271b10..246b149 100644 --- a/src/volume.c +++ b/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,