{
struct ma_state *mas;
struct ma_state tmp_mas;
- struct ma_node_info src2, parent, new_parent;
+ struct ma_node_info parent, new_parent;
+ struct ma_node_info src, src2, left, right;
+ struct split_data sd;
+ struct ma_node_part part;
unsigned char max, height;
bool left_store = false;
tmp_mas = *mas;
while (height--) {
mas_wr_ascend_init(&tmp_mas, &parent);
- max = mt_slots[src->type] - 1;
- if (ma_is_leaf(src->type))
+ max = mt_slots[src.type] - 1;
+ if (ma_is_leaf(src.type))
max--;
- src->end = mas->end;
+ src.end = mas->end;
if (parent.insert_off != mas->end) {
/* Right sibling exists, rebalance against right */
tmp_mas.offset = parent.insert_off + 1;
mni_mas_init(&src2, &tmp_mas);
mni_set_end(&src2);
left_store = true;
- sd->insert = mas->offset;
+ sd.insert = mas->offset;
} else {
/* Rebalance against left sibling */
tmp_mas.offset--;
mni_mas_init(&src2, &tmp_mas);
mni_node_init(&right, mas_pop_node(mas), wr_mas->type);
parent.insert_off--;
- sd->insert = mas->offset + src2.end + 1;
+ sd.insert = mas->offset + src2.end + 1;
}
- sd->new_end += src2.end + 1;
+ sd.new_end += src2.end + 1;
mni_node_init(&left, mas_pop_node(mas), wr_mas->type);
- if (sd->new_end > 2 * mt_min_slots[src.type]) {
+ if (sd.new_end > 2 * mt_min_slots[src.type]) {
printk("Rebalance\n");
mni_node_init(&right, mas_pop_node(mas), wr_mas->type);
- sd->split = mas_wr_rebalance_calc(sd->new_end,
+ sd.split = mas_wr_rebalance_calc(sd.new_end,
src2.type);
/*
* Rebalance between nodes is possible, so the
/* Taken from mas_wr_try_rebalance */
if (left_store) {
/* Left pushes data right. */
- sd->insert = mas->offset;
- sd->space = sd->split;
- sd->offset = 0;
+ sd.insert = mas->offset;
+ sd.space = sd.split;
+ sd.offset = 0;
} else {
/* Right pushes data left */
- sd->insert = mas->offset + src2.end + 1;
- sd->offset = src2.end + 1;
- sd->space = sd->split - src2.end;
- sd->states[sd->len].info = &src2;
- mns_mni_init(&sd->states[sd->len], left, 0, src2.end + 1);
- sd->len++;
+ sd.insert = mas->offset + src2.end + 1;
+ sd.offset = src2.end + 1;
+ sd.space = sd.split - src2.end;
+ sd.states[sd.len].info = &src2;
+ mns_mni_init(&sd.states[sd.len], &left, 0, src2.end + 1);
+ sd.len++;
}
/*
* There can also be a split between nodes that may happen at these
* boundaries, or elsewhere.
*/
- mt_wr_split_data(src, left, right, part, sd);
+ mt_wr_split_data(&src, &left, &right, &part, &sd);
if (left_store) {
- sd->states[sd->len].info = &src2;
- mns_mni_init(&sd->states[sd->len], right, 0, src2.end + 1);
- sd->len++;
+ sd.states[sd.len].info = &src2;
+ mns_mni_init(&sd.states[sd.len], &right, 0, src2.end + 1);
+ sd.len++;
}
- mns_assemble(sd->states, sd->len);
- mni_finalise(left);
- mni_finalise(right);
- mni_node_part_init(part, left, right);
- part->skip = 2;
+ mns_assemble(sd.states, sd.len);
+ mni_finalise(&left);
+ mni_finalise(&right);
+ mni_node_part_init(&part, &left, &right);
+ part.skip = 2;
mas_ascend(mas);
mas->end = parent.end;
mas->offset = parent.insert_off;
- mas_wr_converged(&parent, &new_parent, part, mas, sd);
- src->enode = parent.enode;
+ mas_wr_converged(&parent, &new_parent, &part, mas, &sd);
+ src.enode = parent.enode;
mas->node = new_parent.enode;
/* FIXME: make another function */
/* We can stop rebalancing here */
* Absorb all the data from two nodes, which may need
* more rebalancing
*/
- sd->split = sd->new_end + 2; /* No split */
+ sd.split = sd.new_end + 2; /* No split */
if (!left_store) {
- sd->states[sd->len].info = &src2;
- mns_mni_init(&sd->states[sd->len], left, 0, src2.end + 1);
- sd->len++;
+ sd.states[sd.len].info = &src2;
+ mns_mni_init(&sd.states[sd.len], &left, 0, src2.end + 1);
+ sd.len++;
}
- mt_wr_split_data(src, left, NULL, part, sd);
+ mt_wr_split_data(&src, &left, NULL, &part, &sd);
if (left_store) {
- sd->states[sd->len].info = &src2;
- mns_mni_init(&sd->states[sd->len], left, 0, src2.end + 1);
- sd->len++;
+ sd.states[sd.len].info = &src2;
+ mns_mni_init(&sd.states[sd.len], &left, 0, src2.end + 1);
+ sd.len++;
}
- mns_assemble(sd->states, sd->len);
- mni_finalise(left);
+ mns_assemble(sd.states, sd.len);
+ mni_finalise(&left);
if (ma_is_root(parent.node) && parent.end == 1) {
/* New root */
}
if (parent.end > mt_min_slots[parent.type]) {
- mni_node_part_init(part, left, NULL);
+ mni_node_part_init(&part, &left, NULL);
break;
}
}
mas_ascend(mas);
mas->end = parent.end - 1;
mas->offset = parent.insert_off;
- mas_wr_converged(&parent, &new_parent, part, mas, sd);
- src->enode = parent.enode;
+ mas_wr_converged(&parent, &new_parent, &part, mas, &sd);
+ src.enode = parent.enode;
mas->node = new_parent.enode;
replace_node:
mas_wmb_replace(mas, src.enode);
mas_wr_split(wr_mas);
break;
case wr_rebalance:
- mas_wr_bnode(wr_mas);
- //mas_wr_rebalance(wr_mas);
+ //mas_wr_bnode(wr_mas);
+ mas_wr_rebalance(wr_mas);
break;
case wr_exact_fit:
rcu_assign_pointer(wr_mas->slots[mas->offset], wr_mas->entry);