}
/* no exact match, use the closest one */
- if (!n)
- s = rb_entry(found, struct kdbus_pool_slice, rb_node);
-
- /* move slice from free to the busy tree */
- rb_erase(found, &pool->slices_free);
- kdbus_pool_add_busy_slice(pool, s);
-
- /* we got a slice larger than what we asked for? */
- if (s->size > slice_size) {
+ if (!n) {
struct kdbus_pool_slice *s_new;
+ s = rb_entry(found, struct kdbus_pool_slice, rb_node);
+
/* split-off the remainder of the size to its own slice */
s_new = kdbus_pool_slice_new(pool, s->off + slice_size,
s->size - slice_size);
s->size = slice_size;
}
+ /* move slice from free to the busy tree */
+ rb_erase(found, &pool->slices_free);
+ kdbus_pool_add_busy_slice(pool, s);
+
WARN_ON(s->ref_kernel || s->ref_user);
s->ref_kernel = true;