|
|
@@ -628,39 +628,40 @@ static int btree_split_beneath(struct shadow_spine *s, uint64_t key)
|
|
|
|
|
|
new_parent = shadow_current(s);
|
|
|
|
|
|
+ pn = dm_block_data(new_parent);
|
|
|
+ size = le32_to_cpu(pn->header.flags) & INTERNAL_NODE ?
|
|
|
+ sizeof(__le64) : s->info->value_type.size;
|
|
|
+
|
|
|
+ /* create & init the left block */
|
|
|
r = new_block(s->info, &left);
|
|
|
if (r < 0)
|
|
|
return r;
|
|
|
|
|
|
+ ln = dm_block_data(left);
|
|
|
+ nr_left = le32_to_cpu(pn->header.nr_entries) / 2;
|
|
|
+
|
|
|
+ ln->header.flags = pn->header.flags;
|
|
|
+ ln->header.nr_entries = cpu_to_le32(nr_left);
|
|
|
+ ln->header.max_entries = pn->header.max_entries;
|
|
|
+ ln->header.value_size = pn->header.value_size;
|
|
|
+ memcpy(ln->keys, pn->keys, nr_left * sizeof(pn->keys[0]));
|
|
|
+ memcpy(value_ptr(ln, 0), value_ptr(pn, 0), nr_left * size);
|
|
|
+
|
|
|
+ /* create & init the right block */
|
|
|
r = new_block(s->info, &right);
|
|
|
if (r < 0) {
|
|
|
unlock_block(s->info, left);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
- pn = dm_block_data(new_parent);
|
|
|
- ln = dm_block_data(left);
|
|
|
rn = dm_block_data(right);
|
|
|
-
|
|
|
- nr_left = le32_to_cpu(pn->header.nr_entries) / 2;
|
|
|
nr_right = le32_to_cpu(pn->header.nr_entries) - nr_left;
|
|
|
|
|
|
- ln->header.flags = pn->header.flags;
|
|
|
- ln->header.nr_entries = cpu_to_le32(nr_left);
|
|
|
- ln->header.max_entries = pn->header.max_entries;
|
|
|
- ln->header.value_size = pn->header.value_size;
|
|
|
-
|
|
|
rn->header.flags = pn->header.flags;
|
|
|
rn->header.nr_entries = cpu_to_le32(nr_right);
|
|
|
rn->header.max_entries = pn->header.max_entries;
|
|
|
rn->header.value_size = pn->header.value_size;
|
|
|
-
|
|
|
- memcpy(ln->keys, pn->keys, nr_left * sizeof(pn->keys[0]));
|
|
|
memcpy(rn->keys, pn->keys + nr_left, nr_right * sizeof(pn->keys[0]));
|
|
|
-
|
|
|
- size = le32_to_cpu(pn->header.flags) & INTERNAL_NODE ?
|
|
|
- sizeof(__le64) : s->info->value_type.size;
|
|
|
- memcpy(value_ptr(ln, 0), value_ptr(pn, 0), nr_left * size);
|
|
|
memcpy(value_ptr(rn, 0), value_ptr(pn, nr_left),
|
|
|
nr_right * size);
|
|
|
|