Lines Matching refs:sb
366 static void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap,
368 static void ext4_mb_generate_from_freelist(struct super_block *sb, void *bitmap,
370 static void ext4_free_data_callback(struct super_block *sb,
470 struct super_block *sb = e4b->bd_sb; in mb_free_blocks_double() local
474 assert_spin_locked(ext4_group_lock_ptr(sb, e4b->bd_group)); in mb_free_blocks_double()
479 blocknr = ext4_group_first_block_no(sb, e4b->bd_group); in mb_free_blocks_double()
480 blocknr += EXT4_C2B(EXT4_SB(sb), first + i); in mb_free_blocks_double()
481 ext4_grp_locked_error(sb, e4b->bd_group, in mb_free_blocks_double()
557 struct super_block *sb = e4b->bd_sb; in __mb_check_buddy() local
639 grp = ext4_get_group_info(sb, e4b->bd_group); in __mb_check_buddy()
644 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &groupnr, &k); in __mb_check_buddy()
664 static void ext4_mb_mark_free_simple(struct super_block *sb, in ext4_mb_mark_free_simple() argument
668 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_mark_free_simple()
674 BUG_ON(len > EXT4_CLUSTERS_PER_GROUP(sb)); in ext4_mb_mark_free_simple()
676 border = 2 << sb->s_blocksize_bits; in ext4_mb_mark_free_simple()
705 mb_set_largest_free_order(struct super_block *sb, struct ext4_group_info *grp) in mb_set_largest_free_order() argument
712 bits = sb->s_blocksize_bits + 1; in mb_set_largest_free_order()
722 void ext4_mb_generate_buddy(struct super_block *sb, in ext4_mb_generate_buddy() argument
725 struct ext4_group_info *grp = ext4_get_group_info(sb, group); in ext4_mb_generate_buddy()
726 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_generate_buddy()
727 ext4_grpblk_t max = EXT4_CLUSTERS_PER_GROUP(sb); in ext4_mb_generate_buddy()
746 ext4_mb_mark_free_simple(sb, buddy, first, len, grp); in ext4_mb_generate_buddy()
755 ext4_grp_locked_error(sb, group, 0, 0, in ext4_mb_generate_buddy()
769 mb_set_largest_free_order(sb, grp); in ext4_mb_generate_buddy()
774 spin_lock(&EXT4_SB(sb)->s_bal_lock); in ext4_mb_generate_buddy()
775 EXT4_SB(sb)->s_mb_buddies_generated++; in ext4_mb_generate_buddy()
776 EXT4_SB(sb)->s_mb_generation_time += period; in ext4_mb_generate_buddy()
777 spin_unlock(&EXT4_SB(sb)->s_bal_lock); in ext4_mb_generate_buddy()
828 struct super_block *sb; in ext4_mb_init_cache() local
839 sb = inode->i_sb; in ext4_mb_init_cache()
840 ngroups = ext4_get_groups_count(sb); in ext4_mb_init_cache()
866 grinfo = ext4_get_group_info(sb, group); in ext4_mb_init_cache()
877 bh[i] = ext4_read_block_bitmap_nowait(sb, group); in ext4_mb_init_cache()
892 err2 = ext4_wait_block_bitmap(sb, group, bh[i]); in ext4_mb_init_cache()
930 trace_ext4_mb_buddy_bitmap_load(sb, group); in ext4_mb_init_cache()
931 grinfo = ext4_get_group_info(sb, group); in ext4_mb_init_cache()
935 (sb->s_blocksize_bits+2)); in ext4_mb_init_cache()
939 ext4_lock_group(sb, group); in ext4_mb_init_cache()
942 ext4_mb_generate_buddy(sb, data, incore, group); in ext4_mb_init_cache()
943 ext4_unlock_group(sb, group); in ext4_mb_init_cache()
950 trace_ext4_mb_bitmap_load(sb, group); in ext4_mb_init_cache()
953 ext4_lock_group(sb, group); in ext4_mb_init_cache()
957 ext4_mb_generate_from_pa(sb, data, group); in ext4_mb_init_cache()
958 ext4_mb_generate_from_freelist(sb, data, group); in ext4_mb_init_cache()
959 ext4_unlock_group(sb, group); in ext4_mb_init_cache()
985 static int ext4_mb_get_buddy_page_lock(struct super_block *sb, in ext4_mb_get_buddy_page_lock() argument
988 struct inode *inode = EXT4_SB(sb)->s_buddy_cache; in ext4_mb_get_buddy_page_lock()
996 blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize; in ext4_mb_get_buddy_page_lock()
1010 e4b->bd_bitmap = page_address(page) + (poff * sb->s_blocksize); in ext4_mb_get_buddy_page_lock()
1045 int ext4_mb_init_group(struct super_block *sb, ext4_group_t group) in ext4_mb_init_group() argument
1055 this_grp = ext4_get_group_info(sb, group); in ext4_mb_init_group()
1065 ret = ext4_mb_get_buddy_page_lock(sb, group, &e4b); in ext4_mb_init_group()
1112 ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group, in ext4_mb_load_buddy() argument
1122 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_load_buddy()
1128 blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize; in ext4_mb_load_buddy()
1129 grp = ext4_get_group_info(sb, group); in ext4_mb_load_buddy()
1131 e4b->bd_blkbits = sb->s_blocksize_bits; in ext4_mb_load_buddy()
1133 e4b->bd_sb = sb; in ext4_mb_load_buddy()
1143 ret = ext4_mb_init_group(sb, group); in ext4_mb_load_buddy()
1181 (poff * sb->s_blocksize)); in ext4_mb_load_buddy()
1197 e4b->bd_bitmap = page_address(page) + (poff * sb->s_blocksize); in ext4_mb_load_buddy()
1231 e4b->bd_buddy = page_address(page) + (poff * sb->s_blocksize); in ext4_mb_load_buddy()
1426 struct super_block *sb = e4b->bd_sb; in mb_free_blocks() local
1430 BUG_ON(last >= (sb->s_blocksize << 3)); in mb_free_blocks()
1431 assert_spin_locked(ext4_group_lock_ptr(sb, e4b->bd_group)); in mb_free_blocks()
1449 if (last + 1 < EXT4_SB(sb)->s_mb_maxs[0]) in mb_free_blocks()
1453 struct ext4_sb_info *sbi = EXT4_SB(sb); in mb_free_blocks()
1456 blocknr = ext4_group_first_block_no(sb, e4b->bd_group); in mb_free_blocks()
1457 blocknr += EXT4_C2B(EXT4_SB(sb), block); in mb_free_blocks()
1458 ext4_grp_locked_error(sb, e4b->bd_group, in mb_free_blocks()
1499 mb_set_largest_free_order(sb, e4b->bd_info); in mb_free_blocks()
1888 struct super_block *sb = ac->ac_sb; in ext4_mb_simple_scan_group() local
1896 for (i = ac->ac_2order; i <= sb->s_blocksize_bits + 1; i++) { in ext4_mb_simple_scan_group()
1916 if (EXT4_SB(sb)->s_mb_stats) in ext4_mb_simple_scan_group()
1917 atomic_inc(&EXT4_SB(sb)->s_bal_2orders); in ext4_mb_simple_scan_group()
1932 struct super_block *sb = ac->ac_sb; in ext4_mb_complex_scan_group() local
1945 EXT4_CLUSTERS_PER_GROUP(sb), i); in ext4_mb_complex_scan_group()
1946 if (i >= EXT4_CLUSTERS_PER_GROUP(sb)) { in ext4_mb_complex_scan_group()
1952 ext4_grp_locked_error(sb, e4b->bd_group, 0, 0, in ext4_mb_complex_scan_group()
1962 ext4_grp_locked_error(sb, e4b->bd_group, 0, 0, in ext4_mb_complex_scan_group()
1991 struct super_block *sb = ac->ac_sb; in ext4_mb_scan_aligned() local
1992 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_scan_aligned()
2003 first_group_block = ext4_group_first_block_no(sb, e4b->bd_group); in ext4_mb_scan_aligned()
2009 while (i < EXT4_CLUSTERS_PER_GROUP(sb)) { in ext4_mb_scan_aligned()
2101 struct super_block *sb; in ext4_mb_regular_allocator() local
2104 sb = ac->ac_sb; in ext4_mb_regular_allocator()
2105 sbi = EXT4_SB(sb); in ext4_mb_regular_allocator()
2106 ngroups = ext4_get_groups_count(sb); in ext4_mb_regular_allocator()
2183 err = ext4_mb_load_buddy(sb, group, &e4b); in ext4_mb_regular_allocator()
2187 ext4_lock_group(sb, group); in ext4_mb_regular_allocator()
2195 ext4_unlock_group(sb, group); in ext4_mb_regular_allocator()
2203 if (cr == 0 && ac->ac_2order < sb->s_blocksize_bits+2) in ext4_mb_regular_allocator()
2211 ext4_unlock_group(sb, group); in ext4_mb_regular_allocator()
2252 struct super_block *sb = seq->private; in ext4_mb_seq_groups_start() local
2255 if (*pos < 0 || *pos >= ext4_get_groups_count(sb)) in ext4_mb_seq_groups_start()
2263 struct super_block *sb = seq->private; in ext4_mb_seq_groups_next() local
2267 if (*pos < 0 || *pos >= ext4_get_groups_count(sb)) in ext4_mb_seq_groups_next()
2275 struct super_block *sb = seq->private; in ext4_mb_seq_groups_show() local
2292 i = (sb->s_blocksize_bits + 2) * sizeof(sg.info.bb_counters[0]) + in ext4_mb_seq_groups_show()
2294 grinfo = ext4_get_group_info(sb, group); in ext4_mb_seq_groups_show()
2297 err = ext4_mb_load_buddy(sb, group, &e4b); in ext4_mb_seq_groups_show()
2305 memcpy(&sg, ext4_get_group_info(sb, group), i); in ext4_mb_seq_groups_show()
2313 seq_printf(seq, " %-5u", i <= sb->s_blocksize_bits + 1 ? in ext4_mb_seq_groups_show()
2333 struct super_block *sb = PDE_DATA(inode); in ext4_mb_seq_groups_open() local
2339 m->private = sb; in ext4_mb_seq_groups_open()
2366 int ext4_mb_alloc_groupinfo(struct super_block *sb, ext4_group_t ngroups) in ext4_mb_alloc_groupinfo() argument
2368 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_alloc_groupinfo()
2372 size = (ngroups + EXT4_DESC_PER_BLOCK(sb) - 1) >> in ext4_mb_alloc_groupinfo()
2373 EXT4_DESC_PER_BLOCK_BITS(sb); in ext4_mb_alloc_groupinfo()
2380 ext4_msg(sb, KERN_ERR, "can't allocate buddy meta group"); in ext4_mb_alloc_groupinfo()
2396 int ext4_mb_add_groupinfo(struct super_block *sb, ext4_group_t group, in ext4_mb_add_groupinfo() argument
2401 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_add_groupinfo()
2403 struct kmem_cache *cachep = get_groupinfo_cache(sb->s_blocksize_bits); in ext4_mb_add_groupinfo()
2410 if (group % EXT4_DESC_PER_BLOCK(sb) == 0) { in ext4_mb_add_groupinfo()
2412 EXT4_DESC_PER_BLOCK_BITS(sb); in ext4_mb_add_groupinfo()
2415 ext4_msg(sb, KERN_ERR, "can't allocate mem " in ext4_mb_add_groupinfo()
2419 sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)] = in ext4_mb_add_groupinfo()
2424 sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)]; in ext4_mb_add_groupinfo()
2425 i = group & (EXT4_DESC_PER_BLOCK(sb) - 1); in ext4_mb_add_groupinfo()
2429 ext4_msg(sb, KERN_ERR, "can't allocate buddy mem"); in ext4_mb_add_groupinfo()
2441 ext4_free_clusters_after_init(sb, group, desc); in ext4_mb_add_groupinfo()
2444 ext4_free_group_clusters(sb, desc); in ext4_mb_add_groupinfo()
2456 kmalloc(sb->s_blocksize, GFP_NOFS); in ext4_mb_add_groupinfo()
2458 bh = ext4_read_block_bitmap(sb, group); in ext4_mb_add_groupinfo()
2461 sb->s_blocksize); in ext4_mb_add_groupinfo()
2470 if (group % EXT4_DESC_PER_BLOCK(sb) == 0) { in ext4_mb_add_groupinfo()
2471 kfree(sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)]); in ext4_mb_add_groupinfo()
2472 sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)] = NULL; in ext4_mb_add_groupinfo()
2478 static int ext4_mb_init_backend(struct super_block *sb) in ext4_mb_init_backend() argument
2480 ext4_group_t ngroups = ext4_get_groups_count(sb); in ext4_mb_init_backend()
2482 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_init_backend()
2487 err = ext4_mb_alloc_groupinfo(sb, ngroups); in ext4_mb_init_backend()
2491 sbi->s_buddy_cache = new_inode(sb); in ext4_mb_init_backend()
2493 ext4_msg(sb, KERN_ERR, "can't get new inode"); in ext4_mb_init_backend()
2503 desc = ext4_get_group_desc(sb, i, NULL); in ext4_mb_init_backend()
2505 ext4_msg(sb, KERN_ERR, "can't read descriptor %u", i); in ext4_mb_init_backend()
2508 if (ext4_mb_add_groupinfo(sb, i, desc) != 0) in ext4_mb_init_backend()
2515 cachep = get_groupinfo_cache(sb->s_blocksize_bits); in ext4_mb_init_backend()
2517 kmem_cache_free(cachep, ext4_get_group_info(sb, i)); in ext4_mb_init_backend()
2577 int ext4_mb_init(struct super_block *sb) in ext4_mb_init() argument
2579 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_init()
2585 i = (sb->s_blocksize_bits + 2) * sizeof(*sbi->s_mb_offsets); in ext4_mb_init()
2593 i = (sb->s_blocksize_bits + 2) * sizeof(*sbi->s_mb_maxs); in ext4_mb_init()
2600 ret = ext4_groupinfo_create_slab(sb->s_blocksize); in ext4_mb_init()
2605 sbi->s_mb_maxs[0] = sb->s_blocksize << 3; in ext4_mb_init()
2610 offset_incr = 1 << (sb->s_blocksize_bits - 1); in ext4_mb_init()
2611 max = sb->s_blocksize << 2; in ext4_mb_init()
2619 } while (i <= sb->s_blocksize_bits + 1); in ext4_mb_init()
2671 ret = ext4_mb_init_backend(sb); in ext4_mb_init()
2706 int ext4_mb_release(struct super_block *sb) in ext4_mb_release() argument
2708 ext4_group_t ngroups = ext4_get_groups_count(sb); in ext4_mb_release()
2712 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_release()
2713 struct kmem_cache *cachep = get_groupinfo_cache(sb->s_blocksize_bits); in ext4_mb_release()
2717 grinfo = ext4_get_group_info(sb, i); in ext4_mb_release()
2721 ext4_lock_group(sb, i); in ext4_mb_release()
2723 ext4_unlock_group(sb, i); in ext4_mb_release()
2727 EXT4_DESC_PER_BLOCK(sb) - 1) >> in ext4_mb_release()
2728 EXT4_DESC_PER_BLOCK_BITS(sb); in ext4_mb_release()
2737 ext4_msg(sb, KERN_INFO, in ext4_mb_release()
2742 ext4_msg(sb, KERN_INFO, in ext4_mb_release()
2750 ext4_msg(sb, KERN_INFO, in ext4_mb_release()
2754 ext4_msg(sb, KERN_INFO, in ext4_mb_release()
2765 static inline int ext4_issue_discard(struct super_block *sb, in ext4_issue_discard() argument
2770 discard_block = (EXT4_C2B(EXT4_SB(sb), cluster) + in ext4_issue_discard()
2771 ext4_group_first_block_no(sb, block_group)); in ext4_issue_discard()
2772 count = EXT4_C2B(EXT4_SB(sb), count); in ext4_issue_discard()
2773 trace_ext4_discard_blocks(sb, in ext4_issue_discard()
2775 return sb_issue_discard(sb, discard_block, count, GFP_NOFS, 0); in ext4_issue_discard()
2782 static void ext4_free_data_callback(struct super_block *sb, in ext4_free_data_callback() argument
2794 if (test_opt(sb, DISCARD)) { in ext4_free_data_callback()
2795 err = ext4_issue_discard(sb, entry->efd_group, in ext4_free_data_callback()
2799 ext4_msg(sb, KERN_WARNING, "discard request in" in ext4_free_data_callback()
2806 err = ext4_mb_load_buddy(sb, entry->efd_group, &e4b); in ext4_free_data_callback()
2815 ext4_lock_group(sb, entry->efd_group); in ext4_free_data_callback()
2826 if (!test_opt(sb, DISCARD)) in ext4_free_data_callback()
2836 ext4_unlock_group(sb, entry->efd_group); in ext4_free_data_callback()
2893 struct super_block *sb; in ext4_mb_mark_diskspace_used() local
2900 sb = ac->ac_sb; in ext4_mb_mark_diskspace_used()
2901 sbi = EXT4_SB(sb); in ext4_mb_mark_diskspace_used()
2903 bitmap_bh = ext4_read_block_bitmap(sb, ac->ac_b_ex.fe_group); in ext4_mb_mark_diskspace_used()
2916 gdp = ext4_get_group_desc(sb, ac->ac_b_ex.fe_group, &gdp_bh); in ext4_mb_mark_diskspace_used()
2921 ext4_free_group_clusters(sb, gdp)); in ext4_mb_mark_diskspace_used()
2928 block = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_mark_diskspace_used()
2932 ext4_error(sb, "Allocating blocks %llu-%llu which overlap " in ext4_mb_mark_diskspace_used()
2938 ext4_lock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_mark_diskspace_used()
2941 ext4_unlock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_mark_diskspace_used()
2948 ext4_lock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_mark_diskspace_used()
2962 ext4_free_group_clusters_set(sb, gdp, in ext4_mb_mark_diskspace_used()
2963 ext4_free_clusters_after_init(sb, in ext4_mb_mark_diskspace_used()
2966 len = ext4_free_group_clusters(sb, gdp) - ac->ac_b_ex.fe_len; in ext4_mb_mark_diskspace_used()
2967 ext4_free_group_clusters_set(sb, gdp, len); in ext4_mb_mark_diskspace_used()
2968 ext4_block_bitmap_csum_set(sb, ac->ac_b_ex.fe_group, gdp, bitmap_bh); in ext4_mb_mark_diskspace_used()
2969 ext4_group_desc_csum_set(sb, ac->ac_b_ex.fe_group, gdp); in ext4_mb_mark_diskspace_used()
2971 ext4_unlock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_mark_diskspace_used()
3009 struct super_block *sb = ac->ac_sb; in ext4_mb_normalize_group_request() local
3013 ac->ac_g_ex.fe_len = EXT4_SB(sb)->s_mb_group_prealloc; in ext4_mb_normalize_group_request()
3447 static void ext4_mb_generate_from_freelist(struct super_block *sb, void *bitmap, in ext4_mb_generate_from_freelist() argument
3454 grp = ext4_get_group_info(sb, group); in ext4_mb_generate_from_freelist()
3471 void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, in ext4_mb_generate_from_pa() argument
3474 struct ext4_group_info *grp = ext4_get_group_info(sb, group); in ext4_mb_generate_from_pa()
3493 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_generate_from_pa()
3521 struct super_block *sb, struct ext4_prealloc_space *pa) in ext4_mb_put_pa() argument
3549 grp = ext4_get_group_number(sb, grp_blk); in ext4_mb_put_pa()
3565 ext4_lock_group(sb, grp); in ext4_mb_put_pa()
3567 ext4_unlock_group(sb, grp); in ext4_mb_put_pa()
3582 struct super_block *sb = ac->ac_sb; in ext4_mb_new_inode_pa() local
3583 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_new_inode_pa()
3636 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_inode_pa()
3654 grp = ext4_get_group_info(sb, ac->ac_b_ex.fe_group); in ext4_mb_new_inode_pa()
3659 ext4_lock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_new_inode_pa()
3661 ext4_unlock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_new_inode_pa()
3676 struct super_block *sb = ac->ac_sb; in ext4_mb_new_group_pa() local
3695 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_group_pa()
3711 atomic_add(pa->pa_free, &EXT4_SB(sb)->s_mb_preallocated); in ext4_mb_new_group_pa()
3713 grp = ext4_get_group_info(sb, ac->ac_b_ex.fe_group); in ext4_mb_new_group_pa()
3720 ext4_lock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_new_group_pa()
3722 ext4_unlock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_new_group_pa()
3754 struct super_block *sb = e4b->bd_sb; in ext4_mb_release_inode_pa() local
3755 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_release_inode_pa()
3765 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); in ext4_mb_release_inode_pa()
3776 (unsigned) ext4_group_first_block_no(sb, group) + bit, in ext4_mb_release_inode_pa()
3780 trace_ext4_mballoc_discard(sb, NULL, group, bit, next - bit); in ext4_mb_release_inode_pa()
3793 ext4_grp_locked_error(sb, group, 0, 0, "free %u, pa_free %u", in ext4_mb_release_inode_pa()
3809 struct super_block *sb = e4b->bd_sb; in ext4_mb_release_group_pa() local
3813 trace_ext4_mb_release_group_pa(sb, pa); in ext4_mb_release_group_pa()
3815 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); in ext4_mb_release_group_pa()
3818 atomic_add(pa->pa_len, &EXT4_SB(sb)->s_mb_discarded); in ext4_mb_release_group_pa()
3819 trace_ext4_mballoc_discard(sb, NULL, group, bit, pa->pa_len); in ext4_mb_release_group_pa()
3834 ext4_mb_discard_group_preallocations(struct super_block *sb, in ext4_mb_discard_group_preallocations() argument
3837 struct ext4_group_info *grp = ext4_get_group_info(sb, group); in ext4_mb_discard_group_preallocations()
3851 bitmap_bh = ext4_read_block_bitmap(sb, group); in ext4_mb_discard_group_preallocations()
3854 ext4_error(sb, "Error %d reading block bitmap for %u", in ext4_mb_discard_group_preallocations()
3859 err = ext4_mb_load_buddy(sb, group, &e4b); in ext4_mb_discard_group_preallocations()
3861 ext4_error(sb, "Error loading buddy information for %u", group); in ext4_mb_discard_group_preallocations()
3867 needed = EXT4_CLUSTERS_PER_GROUP(sb) + 1; in ext4_mb_discard_group_preallocations()
3871 ext4_lock_group(sb, group); in ext4_mb_discard_group_preallocations()
3900 ext4_unlock_group(sb, group); in ext4_mb_discard_group_preallocations()
3929 ext4_unlock_group(sb, group); in ext4_mb_discard_group_preallocations()
3947 struct super_block *sb = inode->i_sb; in ext4_discard_preallocations() local
3978 ext4_msg(sb, KERN_ERR, in ext4_discard_preallocations()
4016 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_discard_preallocations()
4018 err = ext4_mb_load_buddy(sb, group, &e4b); in ext4_discard_preallocations()
4020 ext4_error(sb, "Error loading buddy information for %u", in ext4_discard_preallocations()
4025 bitmap_bh = ext4_read_block_bitmap(sb, group); in ext4_discard_preallocations()
4028 ext4_error(sb, "Error %d reading block bitmap for %u", in ext4_discard_preallocations()
4034 ext4_lock_group(sb, group); in ext4_discard_preallocations()
4037 ext4_unlock_group(sb, group); in ext4_discard_preallocations()
4050 struct super_block *sb = ac->ac_sb; in ext4_mb_show_ac() local
4054 (EXT4_SB(sb)->s_mount_flags & EXT4_MF_FS_ABORTED)) in ext4_mb_show_ac()
4079 ngroups = ext4_get_groups_count(sb); in ext4_mb_show_ac()
4081 struct ext4_group_info *grp = ext4_get_group_info(sb, i); in ext4_mb_show_ac()
4085 ext4_lock_group(sb, i); in ext4_mb_show_ac()
4090 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_show_ac()
4096 ext4_unlock_group(sb, i); in ext4_mb_show_ac()
4173 struct super_block *sb = ar->inode->i_sb; in ext4_mb_initialize_context() local
4174 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_initialize_context()
4185 if (len >= EXT4_CLUSTERS_PER_GROUP(sb)) in ext4_mb_initialize_context()
4186 len = EXT4_CLUSTERS_PER_GROUP(sb); in ext4_mb_initialize_context()
4193 ext4_get_group_no_and_offset(sb, goal, &group, &block); in ext4_mb_initialize_context()
4198 ac->ac_sb = sb; in ext4_mb_initialize_context()
4223 ext4_mb_discard_lg_preallocations(struct super_block *sb, in ext4_mb_discard_lg_preallocations() argument
4278 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_mb_discard_lg_preallocations()
4279 if (ext4_mb_load_buddy(sb, group, &e4b)) { in ext4_mb_discard_lg_preallocations()
4280 ext4_error(sb, "Error loading buddy information for %u", in ext4_mb_discard_lg_preallocations()
4284 ext4_lock_group(sb, group); in ext4_mb_discard_lg_preallocations()
4287 ext4_unlock_group(sb, group); in ext4_mb_discard_lg_preallocations()
4307 struct super_block *sb = ac->ac_sb; in ext4_mb_add_n_trim() local
4344 ext4_mb_discard_lg_preallocations(sb, lg, in ext4_mb_add_n_trim()
4394 static int ext4_mb_discard_preallocations(struct super_block *sb, int needed) in ext4_mb_discard_preallocations() argument
4396 ext4_group_t i, ngroups = ext4_get_groups_count(sb); in ext4_mb_discard_preallocations()
4400 trace_ext4_mb_discard_preallocations(sb, needed); in ext4_mb_discard_preallocations()
4402 ret = ext4_mb_discard_group_preallocations(sb, i, needed); in ext4_mb_discard_preallocations()
4421 struct super_block *sb; in ext4_mb_new_blocks() local
4427 sb = ar->inode->i_sb; in ext4_mb_new_blocks()
4428 sbi = EXT4_SB(sb); in ext4_mb_new_blocks()
4524 block = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_blocks()
4528 freed = ext4_mb_discard_preallocations(sb, ac->ac_o_ex.fe_len); in ext4_mb_new_blocks()
4581 struct super_block *sb = e4b->bd_sb; in ext4_mb_free_metadata() local
4582 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_free_metadata()
4610 ext4_grp_locked_error(sb, group, 0, in ext4_mb_free_metadata()
4611 ext4_group_first_block_no(sb, group) + in ext4_mb_free_metadata()
4663 struct super_block *sb = inode->i_sb; in ext4_free_blocks() local
4683 sbi = EXT4_SB(sb); in ext4_free_blocks()
4686 ext4_error(sb, "Freeing blocks not in datazone - " in ext4_free_blocks()
4758 ext4_get_group_no_and_offset(sb, block, &block_group, &bit); in ext4_free_blocks()
4761 ext4_get_group_info(sb, block_group)))) in ext4_free_blocks()
4768 if (EXT4_C2B(sbi, bit) + count > EXT4_BLOCKS_PER_GROUP(sb)) { in ext4_free_blocks()
4770 EXT4_BLOCKS_PER_GROUP(sb); in ext4_free_blocks()
4774 bitmap_bh = ext4_read_block_bitmap(sb, block_group); in ext4_free_blocks()
4780 gdp = ext4_get_group_desc(sb, block_group, &gd_bh); in ext4_free_blocks()
4786 if (in_range(ext4_block_bitmap(sb, gdp), block, count) || in ext4_free_blocks()
4787 in_range(ext4_inode_bitmap(sb, gdp), block, count) || in ext4_free_blocks()
4788 in_range(block, ext4_inode_table(sb, gdp), in ext4_free_blocks()
4789 EXT4_SB(sb)->s_itb_per_group) || in ext4_free_blocks()
4790 in_range(block + count - 1, ext4_inode_table(sb, gdp), in ext4_free_blocks()
4791 EXT4_SB(sb)->s_itb_per_group)) { in ext4_free_blocks()
4793 ext4_error(sb, "Freeing blocks in system zone - " in ext4_free_blocks()
4820 trace_ext4_mballoc_free(sb, inode, block_group, bit, count_clusters); in ext4_free_blocks()
4822 err = ext4_mb_load_buddy(sb, block_group, &e4b); in ext4_free_blocks()
4842 ext4_lock_group(sb, block_group); in ext4_free_blocks()
4850 if (test_opt(sb, DISCARD)) { in ext4_free_blocks()
4851 err = ext4_issue_discard(sb, block_group, bit, count); in ext4_free_blocks()
4853 ext4_msg(sb, KERN_WARNING, "discard request in" in ext4_free_blocks()
4860 ext4_lock_group(sb, block_group); in ext4_free_blocks()
4865 ret = ext4_free_group_clusters(sb, gdp) + count_clusters; in ext4_free_blocks()
4866 ext4_free_group_clusters_set(sb, gdp, ret); in ext4_free_blocks()
4867 ext4_block_bitmap_csum_set(sb, block_group, gdp, bitmap_bh); in ext4_free_blocks()
4868 ext4_group_desc_csum_set(sb, block_group, gdp); in ext4_free_blocks()
4869 ext4_unlock_group(sb, block_group); in ext4_free_blocks()
4901 ext4_std_error(sb, err); in ext4_free_blocks()
4914 int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, in ext4_group_add_blocks() argument
4923 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_group_add_blocks()
4933 ext4_get_group_no_and_offset(sb, block, &block_group, &bit); in ext4_group_add_blocks()
4938 if (bit + count > EXT4_BLOCKS_PER_GROUP(sb)) { in ext4_group_add_blocks()
4939 ext4_warning(sb, "too much blocks added to group %u\n", in ext4_group_add_blocks()
4945 bitmap_bh = ext4_read_block_bitmap(sb, block_group); in ext4_group_add_blocks()
4952 desc = ext4_get_group_desc(sb, block_group, &gd_bh); in ext4_group_add_blocks()
4958 if (in_range(ext4_block_bitmap(sb, desc), block, count) || in ext4_group_add_blocks()
4959 in_range(ext4_inode_bitmap(sb, desc), block, count) || in ext4_group_add_blocks()
4960 in_range(block, ext4_inode_table(sb, desc), sbi->s_itb_per_group) || in ext4_group_add_blocks()
4961 in_range(block + count - 1, ext4_inode_table(sb, desc), in ext4_group_add_blocks()
4963 ext4_error(sb, "Adding blocks in system zones - " in ext4_group_add_blocks()
4988 ext4_error(sb, "bit already cleared for block %llu", in ext4_group_add_blocks()
4996 err = ext4_mb_load_buddy(sb, block_group, &e4b); in ext4_group_add_blocks()
5005 ext4_lock_group(sb, block_group); in ext4_group_add_blocks()
5008 blk_free_count = blocks_freed + ext4_free_group_clusters(sb, desc); in ext4_group_add_blocks()
5009 ext4_free_group_clusters_set(sb, desc, blk_free_count); in ext4_group_add_blocks()
5010 ext4_block_bitmap_csum_set(sb, block_group, desc, bitmap_bh); in ext4_group_add_blocks()
5011 ext4_group_desc_csum_set(sb, block_group, desc); in ext4_group_add_blocks()
5012 ext4_unlock_group(sb, block_group); in ext4_group_add_blocks()
5036 ext4_std_error(sb, err); in ext4_group_add_blocks()
5052 static int ext4_trim_extent(struct super_block *sb, int start, int count, in ext4_trim_extent() argument
5060 trace_ext4_trim_extent(sb, group, start, count); in ext4_trim_extent()
5062 assert_spin_locked(ext4_group_lock_ptr(sb, group)); in ext4_trim_extent()
5073 ext4_unlock_group(sb, group); in ext4_trim_extent()
5074 ret = ext4_issue_discard(sb, group, start, count); in ext4_trim_extent()
5075 ext4_lock_group(sb, group); in ext4_trim_extent()
5099 ext4_trim_all_free(struct super_block *sb, ext4_group_t group, in ext4_trim_all_free() argument
5108 trace_ext4_trim_all_free(sb, group, start, max); in ext4_trim_all_free()
5110 ret = ext4_mb_load_buddy(sb, group, &e4b); in ext4_trim_all_free()
5112 ext4_error(sb, "Error in loading buddy " in ext4_trim_all_free()
5118 ext4_lock_group(sb, group); in ext4_trim_all_free()
5120 minblocks >= atomic_read(&EXT4_SB(sb)->s_last_trim_minblks)) in ext4_trim_all_free()
5133 ret = ext4_trim_extent(sb, start, in ext4_trim_all_free()
5149 ext4_unlock_group(sb, group); in ext4_trim_all_free()
5151 ext4_lock_group(sb, group); in ext4_trim_all_free()
5163 ext4_unlock_group(sb, group); in ext4_trim_all_free()
5184 int ext4_trim_fs(struct super_block *sb, struct fstrim_range *range) in ext4_trim_fs() argument
5191 le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block); in ext4_trim_fs()
5192 ext4_fsblk_t max_blks = ext4_blocks_count(EXT4_SB(sb)->s_es); in ext4_trim_fs()
5195 start = range->start >> sb->s_blocksize_bits; in ext4_trim_fs()
5196 end = start + (range->len >> sb->s_blocksize_bits) - 1; in ext4_trim_fs()
5197 minlen = EXT4_NUM_B2C(EXT4_SB(sb), in ext4_trim_fs()
5198 range->minlen >> sb->s_blocksize_bits); in ext4_trim_fs()
5200 if (minlen > EXT4_CLUSTERS_PER_GROUP(sb) || in ext4_trim_fs()
5202 range->len < sb->s_blocksize) in ext4_trim_fs()
5212 ext4_get_group_no_and_offset(sb, (ext4_fsblk_t) start, in ext4_trim_fs()
5214 ext4_get_group_no_and_offset(sb, (ext4_fsblk_t) end, in ext4_trim_fs()
5218 end = EXT4_CLUSTERS_PER_GROUP(sb) - 1; in ext4_trim_fs()
5221 grp = ext4_get_group_info(sb, group); in ext4_trim_fs()
5224 ret = ext4_mb_init_group(sb, group); in ext4_trim_fs()
5239 cnt = ext4_trim_all_free(sb, group, first_cluster, in ext4_trim_fs()
5256 atomic_set(&EXT4_SB(sb)->s_last_trim_minblks, minlen); in ext4_trim_fs()
5259 range->len = EXT4_C2B(EXT4_SB(sb), trimmed) << sb->s_blocksize_bits; in ext4_trim_fs()