Lines Matching refs:resize
375 struct resize { struct
423 static int drop_blocks(struct resize *resize, unsigned begin_index, in drop_blocks() argument
430 r = dm_btree_remove(&resize->info->btree_info, resize->root, in drop_blocks()
431 &key, &resize->root); in drop_blocks()
451 static int shrink(struct resize *resize) in shrink() argument
461 if (resize->new_nr_full_blocks < resize->old_nr_full_blocks) { in shrink()
462 begin = total_nr_blocks_needed(resize->new_nr_full_blocks, in shrink()
463 resize->new_nr_entries_in_last_block); in shrink()
464 end = total_nr_blocks_needed(resize->old_nr_full_blocks, in shrink()
465 resize->old_nr_entries_in_last_block); in shrink()
467 r = drop_blocks(resize, begin, end); in shrink()
475 if (resize->new_nr_entries_in_last_block) { in shrink()
476 r = shadow_ablock(resize->info, &resize->root, in shrink()
477 resize->new_nr_full_blocks, &block, &ab); in shrink()
481 trim_ablock(resize->info, ab, resize->new_nr_entries_in_last_block); in shrink()
482 unlock_ablock(resize->info, block); in shrink()
491 static int grow_extend_tail_block(struct resize *resize, uint32_t new_nr_entries) in grow_extend_tail_block() argument
497 r = shadow_ablock(resize->info, &resize->root, in grow_extend_tail_block()
498 resize->old_nr_full_blocks, &block, &ab); in grow_extend_tail_block()
502 fill_ablock(resize->info, ab, resize->value, new_nr_entries); in grow_extend_tail_block()
503 unlock_ablock(resize->info, block); in grow_extend_tail_block()
508 static int grow_add_tail_block(struct resize *resize) in grow_add_tail_block() argument
510 return insert_new_ablock(resize->info, resize->size_of_block, in grow_add_tail_block()
511 resize->max_entries, in grow_add_tail_block()
512 resize->new_nr_full_blocks, in grow_add_tail_block()
513 resize->new_nr_entries_in_last_block, in grow_add_tail_block()
514 resize->value, &resize->root); in grow_add_tail_block()
517 static int grow_needs_more_blocks(struct resize *resize) in grow_needs_more_blocks() argument
520 unsigned old_nr_blocks = resize->old_nr_full_blocks; in grow_needs_more_blocks()
522 if (resize->old_nr_entries_in_last_block > 0) { in grow_needs_more_blocks()
525 r = grow_extend_tail_block(resize, resize->max_entries); in grow_needs_more_blocks()
530 r = insert_full_ablocks(resize->info, resize->size_of_block, in grow_needs_more_blocks()
532 resize->new_nr_full_blocks, in grow_needs_more_blocks()
533 resize->max_entries, resize->value, in grow_needs_more_blocks()
534 &resize->root); in grow_needs_more_blocks()
538 if (resize->new_nr_entries_in_last_block) in grow_needs_more_blocks()
539 r = grow_add_tail_block(resize); in grow_needs_more_blocks()
544 static int grow(struct resize *resize) in grow() argument
546 if (resize->new_nr_full_blocks > resize->old_nr_full_blocks) in grow()
547 return grow_needs_more_blocks(resize); in grow()
549 else if (resize->old_nr_entries_in_last_block) in grow()
550 return grow_extend_tail_block(resize, resize->new_nr_entries_in_last_block); in grow()
553 return grow_add_tail_block(resize); in grow()
646 struct resize resize; in array_resize() local
653 resize.info = info; in array_resize()
654 resize.root = root; in array_resize()
655 resize.size_of_block = dm_bm_block_size(dm_tm_get_bm(info->btree_info.tm)); in array_resize()
656 resize.max_entries = calc_max_entries(info->value_type.size, in array_resize()
657 resize.size_of_block); in array_resize()
659 resize.old_nr_full_blocks = old_size / resize.max_entries; in array_resize()
660 resize.old_nr_entries_in_last_block = old_size % resize.max_entries; in array_resize()
661 resize.new_nr_full_blocks = new_size / resize.max_entries; in array_resize()
662 resize.new_nr_entries_in_last_block = new_size % resize.max_entries; in array_resize()
663 resize.value = value; in array_resize()
665 r = ((new_size > old_size) ? grow : shrink)(&resize); in array_resize()
669 *new_root = resize.root; in array_resize()