Lines Matching refs:sb

365 static void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap,
367 static void ext4_mb_generate_from_freelist(struct super_block *sb, void *bitmap,
369 static void ext4_free_data_callback(struct super_block *sb,
469 struct super_block *sb = e4b->bd_sb; in mb_free_blocks_double() local
473 assert_spin_locked(ext4_group_lock_ptr(sb, e4b->bd_group)); in mb_free_blocks_double()
478 blocknr = ext4_group_first_block_no(sb, e4b->bd_group); in mb_free_blocks_double()
479 blocknr += EXT4_C2B(EXT4_SB(sb), first + i); in mb_free_blocks_double()
480 ext4_grp_locked_error(sb, e4b->bd_group, in mb_free_blocks_double()
556 struct super_block *sb = e4b->bd_sb; in __mb_check_buddy() local
638 grp = ext4_get_group_info(sb, e4b->bd_group); in __mb_check_buddy()
643 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &groupnr, &k); in __mb_check_buddy()
663 static void ext4_mb_mark_free_simple(struct super_block *sb, in ext4_mb_mark_free_simple() argument
667 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_mark_free_simple()
673 BUG_ON(len > EXT4_CLUSTERS_PER_GROUP(sb)); in ext4_mb_mark_free_simple()
675 border = 2 << sb->s_blocksize_bits; in ext4_mb_mark_free_simple()
704 mb_set_largest_free_order(struct super_block *sb, struct ext4_group_info *grp) in mb_set_largest_free_order() argument
711 bits = sb->s_blocksize_bits + 1; in mb_set_largest_free_order()
721 void ext4_mb_generate_buddy(struct super_block *sb, in ext4_mb_generate_buddy() argument
724 struct ext4_group_info *grp = ext4_get_group_info(sb, group); in ext4_mb_generate_buddy()
725 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_generate_buddy()
726 ext4_grpblk_t max = EXT4_CLUSTERS_PER_GROUP(sb); in ext4_mb_generate_buddy()
745 ext4_mb_mark_free_simple(sb, buddy, first, len, grp); in ext4_mb_generate_buddy()
754 ext4_grp_locked_error(sb, group, 0, 0, in ext4_mb_generate_buddy()
768 mb_set_largest_free_order(sb, grp); in ext4_mb_generate_buddy()
773 spin_lock(&EXT4_SB(sb)->s_bal_lock); in ext4_mb_generate_buddy()
774 EXT4_SB(sb)->s_mb_buddies_generated++; in ext4_mb_generate_buddy()
775 EXT4_SB(sb)->s_mb_generation_time += period; in ext4_mb_generate_buddy()
776 spin_unlock(&EXT4_SB(sb)->s_bal_lock); in ext4_mb_generate_buddy()
827 struct super_block *sb; in ext4_mb_init_cache() local
838 sb = inode->i_sb; in ext4_mb_init_cache()
839 ngroups = ext4_get_groups_count(sb); in ext4_mb_init_cache()
865 grinfo = ext4_get_group_info(sb, group); in ext4_mb_init_cache()
876 if (!(bh[i] = ext4_read_block_bitmap_nowait(sb, group))) { in ext4_mb_init_cache()
885 if (bh[i] && ext4_wait_block_bitmap(sb, group, bh[i])) { in ext4_mb_init_cache()
919 trace_ext4_mb_buddy_bitmap_load(sb, group); in ext4_mb_init_cache()
920 grinfo = ext4_get_group_info(sb, group); in ext4_mb_init_cache()
924 (sb->s_blocksize_bits+2)); in ext4_mb_init_cache()
928 ext4_lock_group(sb, group); in ext4_mb_init_cache()
931 ext4_mb_generate_buddy(sb, data, incore, group); in ext4_mb_init_cache()
932 ext4_unlock_group(sb, group); in ext4_mb_init_cache()
939 trace_ext4_mb_bitmap_load(sb, group); in ext4_mb_init_cache()
942 ext4_lock_group(sb, group); in ext4_mb_init_cache()
946 ext4_mb_generate_from_pa(sb, data, group); in ext4_mb_init_cache()
947 ext4_mb_generate_from_freelist(sb, data, group); in ext4_mb_init_cache()
948 ext4_unlock_group(sb, group); in ext4_mb_init_cache()
974 static int ext4_mb_get_buddy_page_lock(struct super_block *sb, in ext4_mb_get_buddy_page_lock() argument
977 struct inode *inode = EXT4_SB(sb)->s_buddy_cache; in ext4_mb_get_buddy_page_lock()
985 blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize; in ext4_mb_get_buddy_page_lock()
999 e4b->bd_bitmap = page_address(page) + (poff * sb->s_blocksize); in ext4_mb_get_buddy_page_lock()
1034 int ext4_mb_init_group(struct super_block *sb, ext4_group_t group) in ext4_mb_init_group() argument
1044 this_grp = ext4_get_group_info(sb, group); in ext4_mb_init_group()
1054 ret = ext4_mb_get_buddy_page_lock(sb, group, &e4b); in ext4_mb_init_group()
1101 ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group, in ext4_mb_load_buddy() argument
1111 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_load_buddy()
1117 blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize; in ext4_mb_load_buddy()
1118 grp = ext4_get_group_info(sb, group); in ext4_mb_load_buddy()
1120 e4b->bd_blkbits = sb->s_blocksize_bits; in ext4_mb_load_buddy()
1122 e4b->bd_sb = sb; in ext4_mb_load_buddy()
1132 ret = ext4_mb_init_group(sb, group); in ext4_mb_load_buddy()
1170 (poff * sb->s_blocksize)); in ext4_mb_load_buddy()
1186 e4b->bd_bitmap = page_address(page) + (poff * sb->s_blocksize); in ext4_mb_load_buddy()
1220 e4b->bd_buddy = page_address(page) + (poff * sb->s_blocksize); in ext4_mb_load_buddy()
1415 struct super_block *sb = e4b->bd_sb; in mb_free_blocks() local
1419 BUG_ON(last >= (sb->s_blocksize << 3)); in mb_free_blocks()
1420 assert_spin_locked(ext4_group_lock_ptr(sb, e4b->bd_group)); in mb_free_blocks()
1438 if (last + 1 < EXT4_SB(sb)->s_mb_maxs[0]) in mb_free_blocks()
1442 struct ext4_sb_info *sbi = EXT4_SB(sb); in mb_free_blocks()
1445 blocknr = ext4_group_first_block_no(sb, e4b->bd_group); in mb_free_blocks()
1446 blocknr += EXT4_C2B(EXT4_SB(sb), block); in mb_free_blocks()
1447 ext4_grp_locked_error(sb, e4b->bd_group, in mb_free_blocks()
1488 mb_set_largest_free_order(sb, e4b->bd_info); in mb_free_blocks()
1877 struct super_block *sb = ac->ac_sb; in ext4_mb_simple_scan_group() local
1885 for (i = ac->ac_2order; i <= sb->s_blocksize_bits + 1; i++) { in ext4_mb_simple_scan_group()
1905 if (EXT4_SB(sb)->s_mb_stats) in ext4_mb_simple_scan_group()
1906 atomic_inc(&EXT4_SB(sb)->s_bal_2orders); in ext4_mb_simple_scan_group()
1921 struct super_block *sb = ac->ac_sb; in ext4_mb_complex_scan_group() local
1934 EXT4_CLUSTERS_PER_GROUP(sb), i); in ext4_mb_complex_scan_group()
1935 if (i >= EXT4_CLUSTERS_PER_GROUP(sb)) { in ext4_mb_complex_scan_group()
1941 ext4_grp_locked_error(sb, e4b->bd_group, 0, 0, in ext4_mb_complex_scan_group()
1951 ext4_grp_locked_error(sb, e4b->bd_group, 0, 0, in ext4_mb_complex_scan_group()
1980 struct super_block *sb = ac->ac_sb; in ext4_mb_scan_aligned() local
1981 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_scan_aligned()
1992 first_group_block = ext4_group_first_block_no(sb, e4b->bd_group); in ext4_mb_scan_aligned()
1998 while (i < EXT4_CLUSTERS_PER_GROUP(sb)) { in ext4_mb_scan_aligned()
2085 struct super_block *sb; in ext4_mb_regular_allocator() local
2088 sb = ac->ac_sb; in ext4_mb_regular_allocator()
2089 sbi = EXT4_SB(sb); in ext4_mb_regular_allocator()
2090 ngroups = ext4_get_groups_count(sb); in ext4_mb_regular_allocator()
2162 err = ext4_mb_load_buddy(sb, group, &e4b); in ext4_mb_regular_allocator()
2166 ext4_lock_group(sb, group); in ext4_mb_regular_allocator()
2173 ext4_unlock_group(sb, group); in ext4_mb_regular_allocator()
2179 if (cr == 0 && ac->ac_2order < sb->s_blocksize_bits+2) in ext4_mb_regular_allocator()
2187 ext4_unlock_group(sb, group); in ext4_mb_regular_allocator()
2226 struct super_block *sb = seq->private; in ext4_mb_seq_groups_start() local
2229 if (*pos < 0 || *pos >= ext4_get_groups_count(sb)) in ext4_mb_seq_groups_start()
2237 struct super_block *sb = seq->private; in ext4_mb_seq_groups_next() local
2241 if (*pos < 0 || *pos >= ext4_get_groups_count(sb)) in ext4_mb_seq_groups_next()
2249 struct super_block *sb = seq->private; in ext4_mb_seq_groups_show() local
2269 i = (sb->s_blocksize_bits + 2) * sizeof(sg.info.bb_counters[0]) + in ext4_mb_seq_groups_show()
2271 grinfo = ext4_get_group_info(sb, group); in ext4_mb_seq_groups_show()
2274 err = ext4_mb_load_buddy(sb, group, &e4b); in ext4_mb_seq_groups_show()
2282 memcpy(&sg, ext4_get_group_info(sb, group), i); in ext4_mb_seq_groups_show()
2290 seq_printf(seq, " %-5u", i <= sb->s_blocksize_bits + 1 ? in ext4_mb_seq_groups_show()
2310 struct super_block *sb = PDE_DATA(inode); in ext4_mb_seq_groups_open() local
2316 m->private = sb; in ext4_mb_seq_groups_open()
2343 int ext4_mb_alloc_groupinfo(struct super_block *sb, ext4_group_t ngroups) in ext4_mb_alloc_groupinfo() argument
2345 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_alloc_groupinfo()
2349 size = (ngroups + EXT4_DESC_PER_BLOCK(sb) - 1) >> in ext4_mb_alloc_groupinfo()
2350 EXT4_DESC_PER_BLOCK_BITS(sb); in ext4_mb_alloc_groupinfo()
2357 ext4_msg(sb, KERN_ERR, "can't allocate buddy meta group"); in ext4_mb_alloc_groupinfo()
2373 int ext4_mb_add_groupinfo(struct super_block *sb, ext4_group_t group, in ext4_mb_add_groupinfo() argument
2378 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_add_groupinfo()
2380 struct kmem_cache *cachep = get_groupinfo_cache(sb->s_blocksize_bits); in ext4_mb_add_groupinfo()
2387 if (group % EXT4_DESC_PER_BLOCK(sb) == 0) { in ext4_mb_add_groupinfo()
2389 EXT4_DESC_PER_BLOCK_BITS(sb); in ext4_mb_add_groupinfo()
2392 ext4_msg(sb, KERN_ERR, "can't allocate mem " in ext4_mb_add_groupinfo()
2396 sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)] = in ext4_mb_add_groupinfo()
2401 sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)]; in ext4_mb_add_groupinfo()
2402 i = group & (EXT4_DESC_PER_BLOCK(sb) - 1); in ext4_mb_add_groupinfo()
2406 ext4_msg(sb, KERN_ERR, "can't allocate buddy mem"); in ext4_mb_add_groupinfo()
2418 ext4_free_clusters_after_init(sb, group, desc); in ext4_mb_add_groupinfo()
2421 ext4_free_group_clusters(sb, desc); in ext4_mb_add_groupinfo()
2433 kmalloc(sb->s_blocksize, GFP_NOFS); in ext4_mb_add_groupinfo()
2435 bh = ext4_read_block_bitmap(sb, group); in ext4_mb_add_groupinfo()
2438 sb->s_blocksize); in ext4_mb_add_groupinfo()
2447 if (group % EXT4_DESC_PER_BLOCK(sb) == 0) { in ext4_mb_add_groupinfo()
2448 kfree(sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)]); in ext4_mb_add_groupinfo()
2449 sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)] = NULL; in ext4_mb_add_groupinfo()
2455 static int ext4_mb_init_backend(struct super_block *sb) in ext4_mb_init_backend() argument
2457 ext4_group_t ngroups = ext4_get_groups_count(sb); in ext4_mb_init_backend()
2459 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_init_backend()
2464 err = ext4_mb_alloc_groupinfo(sb, ngroups); in ext4_mb_init_backend()
2468 sbi->s_buddy_cache = new_inode(sb); in ext4_mb_init_backend()
2470 ext4_msg(sb, KERN_ERR, "can't get new inode"); in ext4_mb_init_backend()
2480 desc = ext4_get_group_desc(sb, i, NULL); in ext4_mb_init_backend()
2482 ext4_msg(sb, KERN_ERR, "can't read descriptor %u", i); in ext4_mb_init_backend()
2485 if (ext4_mb_add_groupinfo(sb, i, desc) != 0) in ext4_mb_init_backend()
2492 cachep = get_groupinfo_cache(sb->s_blocksize_bits); in ext4_mb_init_backend()
2494 kmem_cache_free(cachep, ext4_get_group_info(sb, i)); in ext4_mb_init_backend()
2554 int ext4_mb_init(struct super_block *sb) in ext4_mb_init() argument
2556 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_init()
2562 i = (sb->s_blocksize_bits + 2) * sizeof(*sbi->s_mb_offsets); in ext4_mb_init()
2570 i = (sb->s_blocksize_bits + 2) * sizeof(*sbi->s_mb_maxs); in ext4_mb_init()
2577 ret = ext4_groupinfo_create_slab(sb->s_blocksize); in ext4_mb_init()
2582 sbi->s_mb_maxs[0] = sb->s_blocksize << 3; in ext4_mb_init()
2587 offset_incr = 1 << (sb->s_blocksize_bits - 1); in ext4_mb_init()
2588 max = sb->s_blocksize << 2; in ext4_mb_init()
2596 } while (i <= sb->s_blocksize_bits + 1); in ext4_mb_init()
2648 ret = ext4_mb_init_backend(sb); in ext4_mb_init()
2654 &ext4_mb_seq_groups_fops, sb); in ext4_mb_init()
2687 int ext4_mb_release(struct super_block *sb) in ext4_mb_release() argument
2689 ext4_group_t ngroups = ext4_get_groups_count(sb); in ext4_mb_release()
2693 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_release()
2694 struct kmem_cache *cachep = get_groupinfo_cache(sb->s_blocksize_bits); in ext4_mb_release()
2701 grinfo = ext4_get_group_info(sb, i); in ext4_mb_release()
2705 ext4_lock_group(sb, i); in ext4_mb_release()
2707 ext4_unlock_group(sb, i); in ext4_mb_release()
2711 EXT4_DESC_PER_BLOCK(sb) - 1) >> in ext4_mb_release()
2712 EXT4_DESC_PER_BLOCK_BITS(sb); in ext4_mb_release()
2721 ext4_msg(sb, KERN_INFO, in ext4_mb_release()
2726 ext4_msg(sb, KERN_INFO, in ext4_mb_release()
2734 ext4_msg(sb, KERN_INFO, in ext4_mb_release()
2738 ext4_msg(sb, KERN_INFO, in ext4_mb_release()
2749 static inline int ext4_issue_discard(struct super_block *sb, in ext4_issue_discard() argument
2754 discard_block = (EXT4_C2B(EXT4_SB(sb), cluster) + in ext4_issue_discard()
2755 ext4_group_first_block_no(sb, block_group)); in ext4_issue_discard()
2756 count = EXT4_C2B(EXT4_SB(sb), count); in ext4_issue_discard()
2757 trace_ext4_discard_blocks(sb, in ext4_issue_discard()
2759 return sb_issue_discard(sb, discard_block, count, GFP_NOFS, 0); in ext4_issue_discard()
2766 static void ext4_free_data_callback(struct super_block *sb, in ext4_free_data_callback() argument
2778 if (test_opt(sb, DISCARD)) { in ext4_free_data_callback()
2779 err = ext4_issue_discard(sb, entry->efd_group, in ext4_free_data_callback()
2783 ext4_msg(sb, KERN_WARNING, "discard request in" in ext4_free_data_callback()
2790 err = ext4_mb_load_buddy(sb, entry->efd_group, &e4b); in ext4_free_data_callback()
2799 ext4_lock_group(sb, entry->efd_group); in ext4_free_data_callback()
2810 if (!test_opt(sb, DISCARD)) in ext4_free_data_callback()
2820 ext4_unlock_group(sb, entry->efd_group); in ext4_free_data_callback()
2877 struct super_block *sb; in ext4_mb_mark_diskspace_used() local
2884 sb = ac->ac_sb; in ext4_mb_mark_diskspace_used()
2885 sbi = EXT4_SB(sb); in ext4_mb_mark_diskspace_used()
2888 bitmap_bh = ext4_read_block_bitmap(sb, ac->ac_b_ex.fe_group); in ext4_mb_mark_diskspace_used()
2898 gdp = ext4_get_group_desc(sb, ac->ac_b_ex.fe_group, &gdp_bh); in ext4_mb_mark_diskspace_used()
2903 ext4_free_group_clusters(sb, gdp)); in ext4_mb_mark_diskspace_used()
2910 block = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_mark_diskspace_used()
2914 ext4_error(sb, "Allocating blocks %llu-%llu which overlap " in ext4_mb_mark_diskspace_used()
2920 ext4_lock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_mark_diskspace_used()
2923 ext4_unlock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_mark_diskspace_used()
2930 ext4_lock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_mark_diskspace_used()
2944 ext4_free_group_clusters_set(sb, gdp, in ext4_mb_mark_diskspace_used()
2945 ext4_free_clusters_after_init(sb, in ext4_mb_mark_diskspace_used()
2948 len = ext4_free_group_clusters(sb, gdp) - ac->ac_b_ex.fe_len; in ext4_mb_mark_diskspace_used()
2949 ext4_free_group_clusters_set(sb, gdp, len); in ext4_mb_mark_diskspace_used()
2950 ext4_block_bitmap_csum_set(sb, ac->ac_b_ex.fe_group, gdp, bitmap_bh); in ext4_mb_mark_diskspace_used()
2951 ext4_group_desc_csum_set(sb, ac->ac_b_ex.fe_group, gdp); in ext4_mb_mark_diskspace_used()
2953 ext4_unlock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_mark_diskspace_used()
2991 struct super_block *sb = ac->ac_sb; in ext4_mb_normalize_group_request() local
2995 ac->ac_g_ex.fe_len = EXT4_SB(sb)->s_mb_group_prealloc; in ext4_mb_normalize_group_request()
3429 static void ext4_mb_generate_from_freelist(struct super_block *sb, void *bitmap, in ext4_mb_generate_from_freelist() argument
3436 grp = ext4_get_group_info(sb, group); in ext4_mb_generate_from_freelist()
3453 void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, in ext4_mb_generate_from_pa() argument
3456 struct ext4_group_info *grp = ext4_get_group_info(sb, group); in ext4_mb_generate_from_pa()
3475 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_generate_from_pa()
3503 struct super_block *sb, struct ext4_prealloc_space *pa) in ext4_mb_put_pa() argument
3531 grp = ext4_get_group_number(sb, grp_blk); in ext4_mb_put_pa()
3547 ext4_lock_group(sb, grp); in ext4_mb_put_pa()
3549 ext4_unlock_group(sb, grp); in ext4_mb_put_pa()
3564 struct super_block *sb = ac->ac_sb; in ext4_mb_new_inode_pa() local
3565 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_new_inode_pa()
3618 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_inode_pa()
3636 grp = ext4_get_group_info(sb, ac->ac_b_ex.fe_group); in ext4_mb_new_inode_pa()
3641 ext4_lock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_new_inode_pa()
3643 ext4_unlock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_new_inode_pa()
3658 struct super_block *sb = ac->ac_sb; in ext4_mb_new_group_pa() local
3677 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_group_pa()
3693 atomic_add(pa->pa_free, &EXT4_SB(sb)->s_mb_preallocated); in ext4_mb_new_group_pa()
3695 grp = ext4_get_group_info(sb, ac->ac_b_ex.fe_group); in ext4_mb_new_group_pa()
3702 ext4_lock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_new_group_pa()
3704 ext4_unlock_group(sb, ac->ac_b_ex.fe_group); in ext4_mb_new_group_pa()
3736 struct super_block *sb = e4b->bd_sb; in ext4_mb_release_inode_pa() local
3737 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_release_inode_pa()
3747 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); in ext4_mb_release_inode_pa()
3758 (unsigned) ext4_group_first_block_no(sb, group) + bit, in ext4_mb_release_inode_pa()
3762 trace_ext4_mballoc_discard(sb, NULL, group, bit, next - bit); in ext4_mb_release_inode_pa()
3775 ext4_grp_locked_error(sb, group, 0, 0, "free %u, pa_free %u", in ext4_mb_release_inode_pa()
3791 struct super_block *sb = e4b->bd_sb; in ext4_mb_release_group_pa() local
3795 trace_ext4_mb_release_group_pa(sb, pa); in ext4_mb_release_group_pa()
3797 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); in ext4_mb_release_group_pa()
3800 atomic_add(pa->pa_len, &EXT4_SB(sb)->s_mb_discarded); in ext4_mb_release_group_pa()
3801 trace_ext4_mballoc_discard(sb, NULL, group, bit, pa->pa_len); in ext4_mb_release_group_pa()
3816 ext4_mb_discard_group_preallocations(struct super_block *sb, in ext4_mb_discard_group_preallocations() argument
3819 struct ext4_group_info *grp = ext4_get_group_info(sb, group); in ext4_mb_discard_group_preallocations()
3833 bitmap_bh = ext4_read_block_bitmap(sb, group); in ext4_mb_discard_group_preallocations()
3835 ext4_error(sb, "Error reading block bitmap for %u", group); in ext4_mb_discard_group_preallocations()
3839 err = ext4_mb_load_buddy(sb, group, &e4b); in ext4_mb_discard_group_preallocations()
3841 ext4_error(sb, "Error loading buddy information for %u", group); in ext4_mb_discard_group_preallocations()
3847 needed = EXT4_CLUSTERS_PER_GROUP(sb) + 1; in ext4_mb_discard_group_preallocations()
3851 ext4_lock_group(sb, group); in ext4_mb_discard_group_preallocations()
3880 ext4_unlock_group(sb, group); in ext4_mb_discard_group_preallocations()
3909 ext4_unlock_group(sb, group); in ext4_mb_discard_group_preallocations()
3927 struct super_block *sb = inode->i_sb; in ext4_discard_preallocations() local
3958 ext4_msg(sb, KERN_ERR, in ext4_discard_preallocations()
3996 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_discard_preallocations()
3998 err = ext4_mb_load_buddy(sb, group, &e4b); in ext4_discard_preallocations()
4000 ext4_error(sb, "Error loading buddy information for %u", in ext4_discard_preallocations()
4005 bitmap_bh = ext4_read_block_bitmap(sb, group); in ext4_discard_preallocations()
4007 ext4_error(sb, "Error reading block bitmap for %u", in ext4_discard_preallocations()
4013 ext4_lock_group(sb, group); in ext4_discard_preallocations()
4016 ext4_unlock_group(sb, group); in ext4_discard_preallocations()
4029 struct super_block *sb = ac->ac_sb; in ext4_mb_show_ac() local
4033 (EXT4_SB(sb)->s_mount_flags & EXT4_MF_FS_ABORTED)) in ext4_mb_show_ac()
4058 ngroups = ext4_get_groups_count(sb); in ext4_mb_show_ac()
4060 struct ext4_group_info *grp = ext4_get_group_info(sb, i); in ext4_mb_show_ac()
4064 ext4_lock_group(sb, i); in ext4_mb_show_ac()
4069 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_show_ac()
4075 ext4_unlock_group(sb, i); in ext4_mb_show_ac()
4152 struct super_block *sb = ar->inode->i_sb; in ext4_mb_initialize_context() local
4153 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_initialize_context()
4164 if (len >= EXT4_CLUSTERS_PER_GROUP(sb)) in ext4_mb_initialize_context()
4165 len = EXT4_CLUSTERS_PER_GROUP(sb); in ext4_mb_initialize_context()
4172 ext4_get_group_no_and_offset(sb, goal, &group, &block); in ext4_mb_initialize_context()
4177 ac->ac_sb = sb; in ext4_mb_initialize_context()
4202 ext4_mb_discard_lg_preallocations(struct super_block *sb, in ext4_mb_discard_lg_preallocations() argument
4257 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_mb_discard_lg_preallocations()
4258 if (ext4_mb_load_buddy(sb, group, &e4b)) { in ext4_mb_discard_lg_preallocations()
4259 ext4_error(sb, "Error loading buddy information for %u", in ext4_mb_discard_lg_preallocations()
4263 ext4_lock_group(sb, group); in ext4_mb_discard_lg_preallocations()
4266 ext4_unlock_group(sb, group); in ext4_mb_discard_lg_preallocations()
4286 struct super_block *sb = ac->ac_sb; in ext4_mb_add_n_trim() local
4323 ext4_mb_discard_lg_preallocations(sb, lg, in ext4_mb_add_n_trim()
4373 static int ext4_mb_discard_preallocations(struct super_block *sb, int needed) in ext4_mb_discard_preallocations() argument
4375 ext4_group_t i, ngroups = ext4_get_groups_count(sb); in ext4_mb_discard_preallocations()
4379 trace_ext4_mb_discard_preallocations(sb, needed); in ext4_mb_discard_preallocations()
4381 ret = ext4_mb_discard_group_preallocations(sb, i, needed); in ext4_mb_discard_preallocations()
4400 struct super_block *sb; in ext4_mb_new_blocks() local
4406 sb = ar->inode->i_sb; in ext4_mb_new_blocks()
4407 sbi = EXT4_SB(sb); in ext4_mb_new_blocks()
4503 block = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_blocks()
4507 freed = ext4_mb_discard_preallocations(sb, ac->ac_o_ex.fe_len); in ext4_mb_new_blocks()
4560 struct super_block *sb = e4b->bd_sb; in ext4_mb_free_metadata() local
4561 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_mb_free_metadata()
4589 ext4_grp_locked_error(sb, group, 0, in ext4_mb_free_metadata()
4590 ext4_group_first_block_no(sb, group) + in ext4_mb_free_metadata()
4642 struct super_block *sb = inode->i_sb; in ext4_free_blocks() local
4662 sbi = EXT4_SB(sb); in ext4_free_blocks()
4665 ext4_error(sb, "Freeing blocks not in datazone - " in ext4_free_blocks()
4735 ext4_get_group_no_and_offset(sb, block, &block_group, &bit); in ext4_free_blocks()
4738 ext4_get_group_info(sb, block_group)))) in ext4_free_blocks()
4745 if (EXT4_C2B(sbi, bit) + count > EXT4_BLOCKS_PER_GROUP(sb)) { in ext4_free_blocks()
4747 EXT4_BLOCKS_PER_GROUP(sb); in ext4_free_blocks()
4751 bitmap_bh = ext4_read_block_bitmap(sb, block_group); in ext4_free_blocks()
4756 gdp = ext4_get_group_desc(sb, block_group, &gd_bh); in ext4_free_blocks()
4762 if (in_range(ext4_block_bitmap(sb, gdp), block, count) || in ext4_free_blocks()
4763 in_range(ext4_inode_bitmap(sb, gdp), block, count) || in ext4_free_blocks()
4764 in_range(block, ext4_inode_table(sb, gdp), in ext4_free_blocks()
4765 EXT4_SB(sb)->s_itb_per_group) || in ext4_free_blocks()
4766 in_range(block + count - 1, ext4_inode_table(sb, gdp), in ext4_free_blocks()
4767 EXT4_SB(sb)->s_itb_per_group)) { in ext4_free_blocks()
4769 ext4_error(sb, "Freeing blocks in system zone - " in ext4_free_blocks()
4796 trace_ext4_mballoc_free(sb, inode, block_group, bit, count_clusters); in ext4_free_blocks()
4798 err = ext4_mb_load_buddy(sb, block_group, &e4b); in ext4_free_blocks()
4818 ext4_lock_group(sb, block_group); in ext4_free_blocks()
4826 if (test_opt(sb, DISCARD)) { in ext4_free_blocks()
4827 err = ext4_issue_discard(sb, block_group, bit, count); in ext4_free_blocks()
4829 ext4_msg(sb, KERN_WARNING, "discard request in" in ext4_free_blocks()
4836 ext4_lock_group(sb, block_group); in ext4_free_blocks()
4841 ret = ext4_free_group_clusters(sb, gdp) + count_clusters; in ext4_free_blocks()
4842 ext4_free_group_clusters_set(sb, gdp, ret); in ext4_free_blocks()
4843 ext4_block_bitmap_csum_set(sb, block_group, gdp, bitmap_bh); in ext4_free_blocks()
4844 ext4_group_desc_csum_set(sb, block_group, gdp); in ext4_free_blocks()
4845 ext4_unlock_group(sb, block_group); in ext4_free_blocks()
4877 ext4_std_error(sb, err); in ext4_free_blocks()
4890 int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, in ext4_group_add_blocks() argument
4899 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_group_add_blocks()
4909 ext4_get_group_no_and_offset(sb, block, &block_group, &bit); in ext4_group_add_blocks()
4914 if (bit + count > EXT4_BLOCKS_PER_GROUP(sb)) { in ext4_group_add_blocks()
4915 ext4_warning(sb, "too much blocks added to group %u\n", in ext4_group_add_blocks()
4921 bitmap_bh = ext4_read_block_bitmap(sb, block_group); in ext4_group_add_blocks()
4927 desc = ext4_get_group_desc(sb, block_group, &gd_bh); in ext4_group_add_blocks()
4933 if (in_range(ext4_block_bitmap(sb, desc), block, count) || in ext4_group_add_blocks()
4934 in_range(ext4_inode_bitmap(sb, desc), block, count) || in ext4_group_add_blocks()
4935 in_range(block, ext4_inode_table(sb, desc), sbi->s_itb_per_group) || in ext4_group_add_blocks()
4936 in_range(block + count - 1, ext4_inode_table(sb, desc), in ext4_group_add_blocks()
4938 ext4_error(sb, "Adding blocks in system zones - " in ext4_group_add_blocks()
4963 ext4_error(sb, "bit already cleared for block %llu", in ext4_group_add_blocks()
4971 err = ext4_mb_load_buddy(sb, block_group, &e4b); in ext4_group_add_blocks()
4980 ext4_lock_group(sb, block_group); in ext4_group_add_blocks()
4983 blk_free_count = blocks_freed + ext4_free_group_clusters(sb, desc); in ext4_group_add_blocks()
4984 ext4_free_group_clusters_set(sb, desc, blk_free_count); in ext4_group_add_blocks()
4985 ext4_block_bitmap_csum_set(sb, block_group, desc, bitmap_bh); in ext4_group_add_blocks()
4986 ext4_group_desc_csum_set(sb, block_group, desc); in ext4_group_add_blocks()
4987 ext4_unlock_group(sb, block_group); in ext4_group_add_blocks()
5011 ext4_std_error(sb, err); in ext4_group_add_blocks()
5027 static int ext4_trim_extent(struct super_block *sb, int start, int count, in ext4_trim_extent() argument
5035 trace_ext4_trim_extent(sb, group, start, count); in ext4_trim_extent()
5037 assert_spin_locked(ext4_group_lock_ptr(sb, group)); in ext4_trim_extent()
5048 ext4_unlock_group(sb, group); in ext4_trim_extent()
5049 ret = ext4_issue_discard(sb, group, start, count); in ext4_trim_extent()
5050 ext4_lock_group(sb, group); in ext4_trim_extent()
5074 ext4_trim_all_free(struct super_block *sb, ext4_group_t group, in ext4_trim_all_free() argument
5083 trace_ext4_trim_all_free(sb, group, start, max); in ext4_trim_all_free()
5085 ret = ext4_mb_load_buddy(sb, group, &e4b); in ext4_trim_all_free()
5087 ext4_error(sb, "Error in loading buddy " in ext4_trim_all_free()
5093 ext4_lock_group(sb, group); in ext4_trim_all_free()
5095 minblocks >= atomic_read(&EXT4_SB(sb)->s_last_trim_minblks)) in ext4_trim_all_free()
5108 ret = ext4_trim_extent(sb, start, in ext4_trim_all_free()
5124 ext4_unlock_group(sb, group); in ext4_trim_all_free()
5126 ext4_lock_group(sb, group); in ext4_trim_all_free()
5138 ext4_unlock_group(sb, group); in ext4_trim_all_free()
5159 int ext4_trim_fs(struct super_block *sb, struct fstrim_range *range) in ext4_trim_fs() argument
5166 le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block); in ext4_trim_fs()
5167 ext4_fsblk_t max_blks = ext4_blocks_count(EXT4_SB(sb)->s_es); in ext4_trim_fs()
5170 start = range->start >> sb->s_blocksize_bits; in ext4_trim_fs()
5171 end = start + (range->len >> sb->s_blocksize_bits) - 1; in ext4_trim_fs()
5172 minlen = EXT4_NUM_B2C(EXT4_SB(sb), in ext4_trim_fs()
5173 range->minlen >> sb->s_blocksize_bits); in ext4_trim_fs()
5175 if (minlen > EXT4_CLUSTERS_PER_GROUP(sb) || in ext4_trim_fs()
5177 range->len < sb->s_blocksize) in ext4_trim_fs()
5187 ext4_get_group_no_and_offset(sb, (ext4_fsblk_t) start, in ext4_trim_fs()
5189 ext4_get_group_no_and_offset(sb, (ext4_fsblk_t) end, in ext4_trim_fs()
5193 end = EXT4_CLUSTERS_PER_GROUP(sb) - 1; in ext4_trim_fs()
5196 grp = ext4_get_group_info(sb, group); in ext4_trim_fs()
5199 ret = ext4_mb_init_group(sb, group); in ext4_trim_fs()
5214 cnt = ext4_trim_all_free(sb, group, first_cluster, in ext4_trim_fs()
5231 atomic_set(&EXT4_SB(sb)->s_last_trim_minblks, minlen); in ext4_trim_fs()
5234 range->len = EXT4_C2B(EXT4_SB(sb), trimmed) << sb->s_blocksize_bits; in ext4_trim_fs()