Lines Matching +full:max +full:- +full:len
1 // SPDX-License-Identifier: GPL-2.0
29 #define MBT_SB(_sb) (container_of((_sb)->s_fs_info, struct mbt_ext4_super_block, sbi))
30 #define MBT_CTX(_sb) (&MBT_SB(_sb)->mbt_ctx)
31 #define MBT_GRP_CTX(_sb, _group) (&MBT_CTX(_sb)->grp_ctx[_group])
41 INIT_LIST_HEAD(&ei->i_orphan); in mbt_alloc_inode()
42 init_rwsem(&ei->xattr_sem); in mbt_alloc_inode()
43 init_rwsem(&ei->i_data_sem); in mbt_alloc_inode()
44 inode_init_once(&ei->vfs_inode); in mbt_alloc_inode()
45 ext4_fc_init_inode(&ei->vfs_inode); in mbt_alloc_inode()
47 return &ei->vfs_inode; in mbt_alloc_inode()
75 /* needed by ext4_mb_init->bdev_nonrot(sb->s_bdev) */ in mbt_mb_init()
76 sb->s_bdev = kzalloc(sizeof(*sb->s_bdev), GFP_KERNEL); in mbt_mb_init()
77 if (sb->s_bdev == NULL) in mbt_mb_init()
78 return -ENOMEM; in mbt_mb_init()
80 sb->s_bdev->bd_queue = kzalloc(sizeof(struct request_queue), GFP_KERNEL); in mbt_mb_init()
81 if (sb->s_bdev->bd_queue == NULL) { in mbt_mb_init()
82 kfree(sb->s_bdev); in mbt_mb_init()
83 return -ENOMEM; in mbt_mb_init()
87 * needed by ext4_mb_init->ext4_mb_init_backend-> sbi->s_buddy_cache = in mbt_mb_init()
90 INIT_LIST_HEAD(&sb->s_inodes); in mbt_mb_init()
91 sb->s_op = &mbt_sops; in mbt_mb_init()
98 ret = percpu_counter_init(&EXT4_SB(sb)->s_freeclusters_counter, block, in mbt_mb_init()
103 ret = percpu_counter_init(&EXT4_SB(sb)->s_dirtyclusters_counter, 0, in mbt_mb_init()
111 percpu_counter_destroy(&EXT4_SB(sb)->s_freeclusters_counter); in mbt_mb_init()
115 kfree(sb->s_bdev->bd_queue); in mbt_mb_init()
116 kfree(sb->s_bdev); in mbt_mb_init()
122 percpu_counter_destroy(&EXT4_SB(sb)->s_dirtyclusters_counter); in mbt_mb_release()
123 percpu_counter_destroy(&EXT4_SB(sb)->s_freeclusters_counter); in mbt_mb_release()
125 kfree(sb->s_bdev->bd_queue); in mbt_mb_release()
126 kfree(sb->s_bdev); in mbt_mb_release()
148 sbi = &fsb->sbi; in mbt_ext4_alloc_super_block()
150 sbi->s_blockgroup_lock = in mbt_ext4_alloc_super_block()
152 if (!sbi->s_blockgroup_lock) in mbt_ext4_alloc_super_block()
155 bgl_lock_init(sbi->s_blockgroup_lock); in mbt_ext4_alloc_super_block()
157 sbi->s_es = &fsb->es; in mbt_ext4_alloc_super_block()
158 sb->s_fs_info = sbi; in mbt_ext4_alloc_super_block()
160 up_write(&sb->s_umount); in mbt_ext4_alloc_super_block()
175 kfree(sbi->s_blockgroup_lock); in mbt_ext4_free_super_block()
192 struct ext4_super_block *es = sbi->s_es; in mbt_init_sb_layout()
194 sb->s_blocksize = 1UL << layout->blocksize_bits; in mbt_init_sb_layout()
195 sb->s_blocksize_bits = layout->blocksize_bits; in mbt_init_sb_layout()
197 sbi->s_groups_count = layout->group_count; in mbt_init_sb_layout()
198 sbi->s_blocks_per_group = layout->blocks_per_group; in mbt_init_sb_layout()
199 sbi->s_cluster_bits = layout->cluster_bits; in mbt_init_sb_layout()
200 sbi->s_cluster_ratio = 1U << layout->cluster_bits; in mbt_init_sb_layout()
201 sbi->s_clusters_per_group = layout->blocks_per_group >> in mbt_init_sb_layout()
202 layout->cluster_bits; in mbt_init_sb_layout()
203 sbi->s_desc_size = layout->desc_size; in mbt_init_sb_layout()
204 sbi->s_desc_per_block_bits = in mbt_init_sb_layout()
205 sb->s_blocksize_bits - (fls(layout->desc_size) - 1); in mbt_init_sb_layout()
206 sbi->s_desc_per_block = 1 << sbi->s_desc_per_block_bits; in mbt_init_sb_layout()
208 es->s_first_data_block = cpu_to_le32(0); in mbt_init_sb_layout()
209 es->s_blocks_count_lo = cpu_to_le32(layout->blocks_per_group * in mbt_init_sb_layout()
210 layout->group_count); in mbt_init_sb_layout()
216 ext4_grpblk_t max = EXT4_CLUSTERS_PER_GROUP(sb); in mbt_grp_ctx_init() local
218 grp_ctx->bitmap_bh.b_data = kzalloc(EXT4_BLOCK_SIZE(sb), GFP_KERNEL); in mbt_grp_ctx_init()
219 if (grp_ctx->bitmap_bh.b_data == NULL) in mbt_grp_ctx_init()
220 return -ENOMEM; in mbt_grp_ctx_init()
221 mb_set_bits(grp_ctx->bitmap_bh.b_data, max, sb->s_blocksize * 8 - max); in mbt_grp_ctx_init()
222 ext4_free_group_clusters_set(sb, &grp_ctx->desc, max); in mbt_grp_ctx_init()
229 kfree(grp_ctx->bitmap_bh.b_data); in mbt_grp_ctx_release()
230 grp_ctx->bitmap_bh.b_data = NULL; in mbt_grp_ctx_release()
234 unsigned int start, unsigned int len) in mbt_ctx_mark_used() argument
238 mb_set_bits(grp_ctx->bitmap_bh.b_data, start, len); in mbt_ctx_mark_used()
245 return grp_ctx->bitmap_bh.b_data; in mbt_ctx_bitmap()
254 ctx->grp_ctx = kcalloc(ngroups, sizeof(struct mbt_grp_ctx), in mbt_ctx_init()
256 if (ctx->grp_ctx == NULL) in mbt_ctx_init()
257 return -ENOMEM; in mbt_ctx_init()
260 if (mbt_grp_ctx_init(sb, &ctx->grp_ctx[i])) in mbt_ctx_init()
268 mb_set_bits(ctx->grp_ctx[0].bitmap_bh.b_data, 0, 1); in mbt_ctx_init()
269 ext4_free_group_clusters_set(sb, &ctx->grp_ctx[0].desc, in mbt_ctx_init()
270 EXT4_CLUSTERS_PER_GROUP(sb) - 1); in mbt_ctx_init()
274 while (i-- > 0) in mbt_ctx_init()
275 mbt_grp_ctx_release(&ctx->grp_ctx[i]); in mbt_ctx_init()
276 kfree(ctx->grp_ctx); in mbt_ctx_init()
277 return -ENOMEM; in mbt_ctx_init()
286 mbt_grp_ctx_release(&ctx->grp_ctx[i]); in mbt_ctx_release()
287 kfree(ctx->grp_ctx); in mbt_ctx_release()
297 get_bh(&grp_ctx->bitmap_bh); in ext4_read_block_bitmap_nowait_stub()
298 return &grp_ctx->bitmap_bh; in ext4_read_block_bitmap_nowait_stub()
322 *bh = &grp_ctx->gd_bh; in ext4_get_group_desc_stub()
324 return &grp_ctx->desc; in ext4_get_group_desc_stub()
330 ext4_grpblk_t len, int flags, in ext4_mb_mark_context_stub() argument
334 struct buffer_head *bitmap_bh = &grp_ctx->bitmap_bh; in ext4_mb_mark_context_stub()
337 mb_set_bits(bitmap_bh->b_data, blkoff, len); in ext4_mb_mark_context_stub()
339 mb_clear_bits(bitmap_bh->b_data, blkoff, len); in ext4_mb_mark_context_stub()
348 (struct mbt_ext4_block_layout *)(test->param_value); in mbt_kunit_init()
354 return -ENOMEM; in mbt_kunit_init()
364 test->priv = sb; in mbt_kunit_init()
378 /* stub function will be called in mbt_mb_init->ext4_mb_init */ in mbt_kunit_init()
382 return -ENOMEM; in mbt_kunit_init()
390 struct super_block *sb = (struct super_block *)test->priv; in mbt_kunit_exit()
399 struct super_block *sb = (struct super_block *)test->priv; in test_new_blocks_simple()
411 inode->i_sb = sb; in test_new_blocks_simple()
460 ext4_grpblk_t len; member
467 ext4_grpblk_t start, len, max; in mbt_generate_test_ranges() local
470 max = EXT4_CLUSTERS_PER_GROUP(sb) / count; in mbt_generate_test_ranges()
472 start = get_random_u32() % max; in mbt_generate_test_ranges()
473 len = get_random_u32() % max; in mbt_generate_test_ranges()
474 len = min(len, max - start); in mbt_generate_test_ranges()
476 ranges[i].start = start + i * max; in mbt_generate_test_ranges()
477 ranges[i].len = len; in mbt_generate_test_ranges()
484 ext4_grpblk_t len) in validate_free_blocks_simple() argument
487 ext4_grpblk_t bit, max = EXT4_CLUSTERS_PER_GROUP(sb); in validate_free_blocks_simple() local
495 bit = mb_find_next_zero_bit(bitmap, max, 0); in validate_free_blocks_simple()
496 KUNIT_ASSERT_EQ_MSG(test, bit, max, in validate_free_blocks_simple()
501 bit = mb_find_next_zero_bit(bitmap, max, 0); in validate_free_blocks_simple()
504 bit = mb_find_next_bit(bitmap, max, bit + 1); in validate_free_blocks_simple()
505 KUNIT_ASSERT_EQ(test, bit, start + len); in validate_free_blocks_simple()
510 ext4_grpblk_t start, ext4_grpblk_t len) in test_free_blocks_simple_range() argument
512 struct super_block *sb = (struct super_block *)test->priv; in test_free_blocks_simple_range()
520 inode->i_sb = sb; in test_free_blocks_simple_range()
522 if (len == 0) in test_free_blocks_simple_range()
527 ext4_free_blocks_simple(inode, block, len); in test_free_blocks_simple_range()
528 validate_free_blocks_simple(test, sb, goal_group, start, len); in test_free_blocks_simple_range()
534 struct super_block *sb = (struct super_block *)test->priv; in test_free_blocks_simple()
535 ext4_grpblk_t max = EXT4_CLUSTERS_PER_GROUP(sb); in test_free_blocks_simple() local
540 mbt_ctx_mark_used(sb, i, 0, max); in test_free_blocks_simple()
545 ranges[i].start, ranges[i].len); in test_free_blocks_simple()
552 ext4_grpblk_t len) in test_mark_diskspace_used_range() argument
554 struct super_block *sb = (struct super_block *)test->priv; in test_mark_diskspace_used_range()
557 ext4_grpblk_t i, max; in test_mark_diskspace_used_range() local
559 /* ext4_mb_mark_diskspace_used will BUG if len is 0 */ in test_mark_diskspace_used_range()
560 if (len == 0) in test_mark_diskspace_used_range()
563 ac->ac_b_ex.fe_group = TEST_GOAL_GROUP; in test_mark_diskspace_used_range()
564 ac->ac_b_ex.fe_start = start; in test_mark_diskspace_used_range()
565 ac->ac_b_ex.fe_len = len; in test_mark_diskspace_used_range()
568 memset(bitmap, 0, sb->s_blocksize); in test_mark_diskspace_used_range()
572 max = EXT4_CLUSTERS_PER_GROUP(sb); in test_mark_diskspace_used_range()
573 i = mb_find_next_bit(bitmap, max, 0); in test_mark_diskspace_used_range()
575 i = mb_find_next_zero_bit(bitmap, max, i + 1); in test_mark_diskspace_used_range()
576 KUNIT_ASSERT_EQ(test, i, start + len); in test_mark_diskspace_used_range()
577 i = mb_find_next_bit(bitmap, max, i + 1); in test_mark_diskspace_used_range()
578 KUNIT_ASSERT_EQ(test, max, i); in test_mark_diskspace_used_range()
583 struct super_block *sb = (struct super_block *)test->priv; in test_mark_diskspace_used()
594 inode->i_sb = sb; in test_mark_diskspace_used()
601 ranges[i].len); in test_mark_diskspace_used()
610 int max; in mbt_generate_buddy() local
612 memset(buddy, 0xff, sb->s_blocksize); in mbt_generate_buddy()
617 max = EXT4_CLUSTERS_PER_GROUP(sb); in mbt_generate_buddy()
618 bb_h = buddy + sbi->s_mb_offsets[1]; in mbt_generate_buddy()
620 off = mb_find_next_zero_bit(bb, max, 0); in mbt_generate_buddy()
621 grp->bb_first_free = off; in mbt_generate_buddy()
622 while (off < max) { in mbt_generate_buddy()
623 grp->bb_counters[0]++; in mbt_generate_buddy()
624 grp->bb_free++; in mbt_generate_buddy()
627 grp->bb_free++; in mbt_generate_buddy()
628 grp->bb_counters[0]--; in mbt_generate_buddy()
630 grp->bb_counters[1]++; in mbt_generate_buddy()
631 grp->bb_largest_free_order = 1; in mbt_generate_buddy()
635 off = mb_find_next_zero_bit(bb, max, off + 1); in mbt_generate_buddy()
638 for (order = 1; order < MB_NUM_ORDERS(sb) - 1; order++) { in mbt_generate_buddy()
639 bb = buddy + sbi->s_mb_offsets[order]; in mbt_generate_buddy()
640 bb_h = buddy + sbi->s_mb_offsets[order + 1]; in mbt_generate_buddy()
641 max = max >> 1; in mbt_generate_buddy()
642 off = mb_find_next_zero_bit(bb, max, 0); in mbt_generate_buddy()
644 while (off < max) { in mbt_generate_buddy()
647 grp->bb_counters[order] -= 2; in mbt_generate_buddy()
649 grp->bb_counters[order + 1]++; in mbt_generate_buddy()
650 grp->bb_largest_free_order = order + 1; in mbt_generate_buddy()
654 off = mb_find_next_zero_bit(bb, max, off + 1); in mbt_generate_buddy()
658 max = EXT4_CLUSTERS_PER_GROUP(sb); in mbt_generate_buddy()
659 off = mb_find_next_zero_bit(bitmap, max, 0); in mbt_generate_buddy()
660 while (off < max) { in mbt_generate_buddy()
661 grp->bb_fragments++; in mbt_generate_buddy()
663 off = mb_find_next_bit(bitmap, max, off + 1); in mbt_generate_buddy()
664 if (off + 1 >= max) in mbt_generate_buddy()
667 off = mb_find_next_zero_bit(bitmap, max, off + 1); in mbt_generate_buddy()
675 struct super_block *sb = (struct super_block *)test->priv; in mbt_validate_group_info()
678 KUNIT_ASSERT_EQ(test, grp1->bb_first_free, in mbt_validate_group_info()
679 grp2->bb_first_free); in mbt_validate_group_info()
680 KUNIT_ASSERT_EQ(test, grp1->bb_fragments, in mbt_validate_group_info()
681 grp2->bb_fragments); in mbt_validate_group_info()
682 KUNIT_ASSERT_EQ(test, grp1->bb_free, grp2->bb_free); in mbt_validate_group_info()
683 KUNIT_ASSERT_EQ(test, grp1->bb_largest_free_order, in mbt_validate_group_info()
684 grp2->bb_largest_free_order); in mbt_validate_group_info()
687 KUNIT_ASSERT_EQ_MSG(test, grp1->bb_counters[i], in mbt_validate_group_info()
688 grp2->bb_counters[i], in mbt_validate_group_info()
690 i, grp1->bb_counters[i], in mbt_validate_group_info()
691 grp2->bb_counters[i]); in mbt_validate_group_info()
705 ext4_grp->bb_counters[i] = 0; in do_test_generate_buddy()
707 ext4_grp->bb_free = mbt_grp->bb_free; in do_test_generate_buddy()
708 memset(ext4_buddy, 0xff, sb->s_blocksize); in do_test_generate_buddy()
712 KUNIT_ASSERT_EQ(test, memcmp(mbt_buddy, ext4_buddy, sb->s_blocksize), in do_test_generate_buddy()
719 struct super_block *sb = (struct super_block *)test->priv; in test_mb_generate_buddy()
725 bitmap = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); in test_mb_generate_buddy()
727 expected_bb = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); in test_mb_generate_buddy()
729 generate_bb = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); in test_mb_generate_buddy()
739 mb_set_bits(bitmap, ranges[i].start, ranges[i].len); in test_mb_generate_buddy()
747 ext4_grpblk_t start, ext4_grpblk_t len, void *bitmap, in test_mb_mark_used_range() argument
750 struct super_block *sb = (struct super_block *)test->priv; in test_mb_mark_used_range()
754 /* mb_mark_used only accepts non-zero len */ in test_mb_mark_used_range()
755 if (len == 0) in test_mb_mark_used_range()
759 ex.fe_len = len; in test_mb_mark_used_range()
766 mb_set_bits(bitmap, start, len); in test_mb_mark_used_range()
768 grp->bb_free -= len; in test_mb_mark_used_range()
769 memset(buddy, 0xff, sb->s_blocksize); in test_mb_mark_used_range()
771 grp->bb_counters[i] = 0; in test_mb_mark_used_range()
774 KUNIT_ASSERT_EQ(test, memcmp(buddy, e4b->bd_buddy, sb->s_blocksize), in test_mb_mark_used_range()
776 mbt_validate_group_info(test, grp, e4b->bd_info); in test_mb_mark_used_range()
782 struct super_block *sb = (struct super_block *)test->priv; in test_mb_mark_used()
790 if (sb->s_blocksize > PAGE_SIZE) in test_mb_mark_used()
793 bitmap = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); in test_mb_mark_used()
795 buddy = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); in test_mb_mark_used()
803 grp->bb_free = EXT4_CLUSTERS_PER_GROUP(sb); in test_mb_mark_used()
807 ranges[i].len, bitmap, buddy, grp); in test_mb_mark_used()
814 ext4_grpblk_t start, ext4_grpblk_t len, void *bitmap, in test_mb_free_blocks_range() argument
817 struct super_block *sb = (struct super_block *)test->priv; in test_mb_free_blocks_range()
820 /* mb_free_blocks will WARN if len is 0 */ in test_mb_free_blocks_range()
821 if (len == 0) in test_mb_free_blocks_range()
824 ext4_lock_group(sb, e4b->bd_group); in test_mb_free_blocks_range()
825 mb_free_blocks(NULL, e4b, start, len); in test_mb_free_blocks_range()
826 ext4_unlock_group(sb, e4b->bd_group); in test_mb_free_blocks_range()
828 mb_clear_bits(bitmap, start, len); in test_mb_free_blocks_range()
830 grp->bb_free += len; in test_mb_free_blocks_range()
831 memset(buddy, 0xff, sb->s_blocksize); in test_mb_free_blocks_range()
833 grp->bb_counters[i] = 0; in test_mb_free_blocks_range()
836 KUNIT_ASSERT_EQ(test, memcmp(buddy, e4b->bd_buddy, sb->s_blocksize), in test_mb_free_blocks_range()
838 mbt_validate_group_info(test, grp, e4b->bd_info); in test_mb_free_blocks_range()
845 struct super_block *sb = (struct super_block *)test->priv; in test_mb_free_blocks()
854 if (sb->s_blocksize > PAGE_SIZE) in test_mb_free_blocks()
857 bitmap = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); in test_mb_free_blocks()
859 buddy = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); in test_mb_free_blocks()
875 grp->bb_free = 0; in test_mb_free_blocks()
876 memset(bitmap, 0xff, sb->s_blocksize); in test_mb_free_blocks()
881 ranges[i].len, bitmap, buddy, grp); in test_mb_free_blocks()
890 struct super_block *sb = (struct super_block *)test->priv; in test_mb_mark_used_cost()
898 if (sb->s_blocksize > PAGE_SIZE) in test_mb_mark_used_cost()
909 if (ranges[i].len == 0) in test_mb_mark_used_cost()
913 ex.fe_len = ranges[i].len; in test_mb_mark_used_cost()
919 all += (end - start); in test_mb_mark_used_cost()
922 if (ranges[i].len == 0) in test_mb_mark_used_cost()
927 ranges[i].len); in test_mb_mark_used_cost()
965 layout->blocksize_bits, layout->cluster_bits, in mbt_show_layout()
966 layout->blocks_per_group, layout->group_count, in mbt_show_layout()
967 layout->desc_size); in mbt_show_layout()