unsigned char len; /* Number of ma_node_states in the states array */
struct ma_node_state states[5];
bool is_alloc;
+ bool left_store;
};
/*
return false;
}
+ sd->left_store = true;
return true;
}
}
parent->insert_off--;
+ sd->left_store = false;
return true;
}
/*
mns_mni_init(&sd->states[sd->len], left, 0, src2.end + 1);
sd->len++;
} else if (can_rebalance_right(&tmp_mas, &parent, &src2, sd)) {
+ /* Left will be src, right will be src2 */
sd->split = src2.end + sd->new_end - sd->split;
left_store = true;
- /* Left will be src, right will be src2 */
left->min = src->min;
right->max = src2.max;
sd->insert = mas->offset;
*/
static void rebalance_two(struct ma_node_info *left, struct ma_node_info *right,
struct ma_node_info *src, struct ma_node_info *src2,
- struct ma_node_part *part, struct split_data *sd,
- bool left_store)
+ struct ma_node_part *part, struct split_data *sd)
{
struct ma_node_info *dst;
struct ma_node_state *state;
sd->insert_end = sd->insert + part->size - 1;
- if (!left_store) {
+ if (!sd->left_store) {
char len;
/*
sd->len++;
} while (src->offset <= src->end);
- if (left_store) {
+ if (sd->left_store) {
char len;
state = &sd->states[sd->len];
part->skip = 2;
}
-static void rebalance_reduce( struct ma_node_info *left,
+/*
+ * rebalance_reduce() - Reduce two nodes into one during a rebalance
+ */
+static void rebalance_reduce(struct ma_node_info *left,
struct ma_node_info *src, struct ma_node_info *src2,
- struct ma_node_part *part, struct split_data *sd,
- bool left_store)
+ struct ma_node_part *part, struct split_data *sd)
{
sd->insert_end = sd->insert + part->size - 1;
- if (!left_store) {
+ if (!sd->left_store) {
left->min = src2->min;
left->max = src->max;
sd->offset = src2->end + 1;
sd->len++;
} while (src->offset <= src->end);
- if (left_store) {
+ if (sd->left_store) {
sd->states[sd->len].info = src2;
mns_mni_init(&sd->states[sd->len], left, 0, src2->end + 1);
sd->len++;
struct split_data sd;
struct ma_node_part part;
unsigned char height;
- bool left_store = false;
mas = wr_mas->mas;
trace_ma_op(__func__, mas);
if (can_rebalance_right(&tmp_mas, &parent, &src2, &sd)) {
/* Left will be src, right will be src2 */
sd.insert = mas->offset;
- left_store = true;
} else {
- /* Won't fail here */
- MAS_BUG_ON(mas, can_rebalance_left(&tmp_mas, &parent, &src2, &sd) == false);
/* Left will be src2, right will be src */
+ MAS_BUG_ON(mas, can_rebalance_left(&tmp_mas, &parent,
+ &src2, &sd) == false);
sd.insert = mas->offset + src2.end + 1;
}
mas->offset = parent.insert_off;
if (sd.new_end >= mt_slots[left.type]) {
mni_node_init(&right, mas_pop_node(mas), left.type);
- rebalance_two(&left, &right, &src, &src2, &part, &sd, left_store);
+ rebalance_two(&left, &right, &src, &src2, &part, &sd);
break;
}
- rebalance_reduce(&left, &src, &src2, &part, &sd, left_store);
+ rebalance_reduce(&left, &src, &src2, &part, &sd);
if (ma_is_root(parent.node)) {
if (parent.end != 1)
break;
goto new_root;
}
-
sd.new_end = mas->end + part.size - part.skip + 1;
- if (sd.new_end > mt_min_slots[parent.type])
+ if (sd.new_end != mas->end) {
+ printk("end is %u part %u skip %u\n", mas->end, part.size, part.skip);
+ BUG_ON(1);
+ }
+ if (mas->end > mt_min_slots[parent.type])
break;
sd.len = 0;