Lines Matching refs:resize
389 struct resize { struct
437 static int drop_blocks(struct resize *resize, unsigned begin_index, in drop_blocks() argument
444 r = dm_btree_remove(&resize->info->btree_info, resize->root, in drop_blocks()
445 &key, &resize->root); in drop_blocks()
465 static int shrink(struct resize *resize) in shrink() argument
475 if (resize->new_nr_full_blocks < resize->old_nr_full_blocks) { in shrink()
476 begin = total_nr_blocks_needed(resize->new_nr_full_blocks, in shrink()
477 resize->new_nr_entries_in_last_block); in shrink()
478 end = total_nr_blocks_needed(resize->old_nr_full_blocks, in shrink()
479 resize->old_nr_entries_in_last_block); in shrink()
481 r = drop_blocks(resize, begin, end); in shrink()
489 if (resize->new_nr_entries_in_last_block) { in shrink()
490 r = shadow_ablock(resize->info, &resize->root, in shrink()
491 resize->new_nr_full_blocks, &block, &ab); in shrink()
495 trim_ablock(resize->info, ab, resize->new_nr_entries_in_last_block); in shrink()
496 unlock_ablock(resize->info, block); in shrink()
505 static int grow_extend_tail_block(struct resize *resize, uint32_t new_nr_entries) in grow_extend_tail_block() argument
511 r = shadow_ablock(resize->info, &resize->root, in grow_extend_tail_block()
512 resize->old_nr_full_blocks, &block, &ab); in grow_extend_tail_block()
516 fill_ablock(resize->info, ab, resize->value, new_nr_entries); in grow_extend_tail_block()
517 unlock_ablock(resize->info, block); in grow_extend_tail_block()
522 static int grow_add_tail_block(struct resize *resize) in grow_add_tail_block() argument
524 return insert_new_ablock(resize->info, resize->size_of_block, in grow_add_tail_block()
525 resize->max_entries, in grow_add_tail_block()
526 resize->new_nr_full_blocks, in grow_add_tail_block()
527 resize->new_nr_entries_in_last_block, in grow_add_tail_block()
528 resize->value, &resize->root); in grow_add_tail_block()
531 static int grow_needs_more_blocks(struct resize *resize) in grow_needs_more_blocks() argument
534 unsigned old_nr_blocks = resize->old_nr_full_blocks; in grow_needs_more_blocks()
536 if (resize->old_nr_entries_in_last_block > 0) { in grow_needs_more_blocks()
539 r = grow_extend_tail_block(resize, resize->max_entries); in grow_needs_more_blocks()
544 r = insert_full_ablocks(resize->info, resize->size_of_block, in grow_needs_more_blocks()
546 resize->new_nr_full_blocks, in grow_needs_more_blocks()
547 resize->max_entries, resize->value, in grow_needs_more_blocks()
548 &resize->root); in grow_needs_more_blocks()
552 if (resize->new_nr_entries_in_last_block) in grow_needs_more_blocks()
553 r = grow_add_tail_block(resize); in grow_needs_more_blocks()
558 static int grow(struct resize *resize) in grow() argument
560 if (resize->new_nr_full_blocks > resize->old_nr_full_blocks) in grow()
561 return grow_needs_more_blocks(resize); in grow()
563 else if (resize->old_nr_entries_in_last_block) in grow()
564 return grow_extend_tail_block(resize, resize->new_nr_entries_in_last_block); in grow()
567 return grow_add_tail_block(resize); in grow()
660 struct resize resize; in array_resize() local
667 resize.info = info; in array_resize()
668 resize.root = root; in array_resize()
669 resize.size_of_block = dm_bm_block_size(dm_tm_get_bm(info->btree_info.tm)); in array_resize()
670 resize.max_entries = calc_max_entries(info->value_type.size, in array_resize()
671 resize.size_of_block); in array_resize()
673 resize.old_nr_full_blocks = old_size / resize.max_entries; in array_resize()
674 resize.old_nr_entries_in_last_block = old_size % resize.max_entries; in array_resize()
675 resize.new_nr_full_blocks = new_size / resize.max_entries; in array_resize()
676 resize.new_nr_entries_in_last_block = new_size % resize.max_entries; in array_resize()
677 resize.value = value; in array_resize()
679 r = ((new_size > old_size) ? grow : shrink)(&resize); in array_resize()
683 *new_root = resize.root; in array_resize()