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