Lines Matching refs:pa
641 struct ext4_prealloc_space *pa; in __mb_check_buddy() local
642 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in __mb_check_buddy()
643 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &groupnr, &k); in __mb_check_buddy()
645 for (i = 0; i < pa->pa_len; i++) in __mb_check_buddy()
2672 struct ext4_prealloc_space *pa; in ext4_mb_cleanup_pa() local
2677 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in ext4_mb_cleanup_pa()
2678 list_del(&pa->pa_group_list); in ext4_mb_cleanup_pa()
2680 kmem_cache_free(ext4_pspace_cachep, pa); in ext4_mb_cleanup_pa()
3015 struct ext4_prealloc_space *pa; in ext4_mb_normalize_request() local
3102 list_for_each_entry_rcu(pa, &ei->i_prealloc_list, pa_inode_list) { in ext4_mb_normalize_request()
3105 if (pa->pa_deleted) in ext4_mb_normalize_request()
3107 spin_lock(&pa->pa_lock); in ext4_mb_normalize_request()
3108 if (pa->pa_deleted) { in ext4_mb_normalize_request()
3109 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3113 pa_end = pa->pa_lstart + EXT4_C2B(EXT4_SB(ac->ac_sb), in ext4_mb_normalize_request()
3114 pa->pa_len); in ext4_mb_normalize_request()
3118 ac->ac_o_ex.fe_logical < pa->pa_lstart)); in ext4_mb_normalize_request()
3121 if (pa->pa_lstart >= end || pa_end <= start) { in ext4_mb_normalize_request()
3122 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3125 BUG_ON(pa->pa_lstart <= start && pa_end >= end); in ext4_mb_normalize_request()
3131 } else if (pa->pa_lstart > ac->ac_o_ex.fe_logical) { in ext4_mb_normalize_request()
3132 BUG_ON(pa->pa_lstart > end); in ext4_mb_normalize_request()
3133 end = pa->pa_lstart; in ext4_mb_normalize_request()
3135 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3142 list_for_each_entry_rcu(pa, &ei->i_prealloc_list, pa_inode_list) { in ext4_mb_normalize_request()
3145 spin_lock(&pa->pa_lock); in ext4_mb_normalize_request()
3146 if (pa->pa_deleted == 0) { in ext4_mb_normalize_request()
3147 pa_end = pa->pa_lstart + EXT4_C2B(EXT4_SB(ac->ac_sb), in ext4_mb_normalize_request()
3148 pa->pa_len); in ext4_mb_normalize_request()
3149 BUG_ON(!(start >= pa_end || end <= pa->pa_lstart)); in ext4_mb_normalize_request()
3151 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3223 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_discard_allocated_blocks() local
3227 if (pa == NULL) { in ext4_discard_allocated_blocks()
3247 if (pa->pa_type == MB_INODE_PA) in ext4_discard_allocated_blocks()
3248 pa->pa_free += ac->ac_b_ex.fe_len; in ext4_discard_allocated_blocks()
3255 struct ext4_prealloc_space *pa) in ext4_mb_use_inode_pa() argument
3263 start = pa->pa_pstart + (ac->ac_o_ex.fe_logical - pa->pa_lstart); in ext4_mb_use_inode_pa()
3264 end = min(pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len), in ext4_mb_use_inode_pa()
3271 ac->ac_pa = pa; in ext4_mb_use_inode_pa()
3273 BUG_ON(start < pa->pa_pstart); in ext4_mb_use_inode_pa()
3274 BUG_ON(end > pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len)); in ext4_mb_use_inode_pa()
3275 BUG_ON(pa->pa_free < len); in ext4_mb_use_inode_pa()
3276 pa->pa_free -= len; in ext4_mb_use_inode_pa()
3278 mb_debug(1, "use %llu/%u from inode pa %p\n", start, len, pa); in ext4_mb_use_inode_pa()
3285 struct ext4_prealloc_space *pa) in ext4_mb_use_group_pa() argument
3289 ext4_get_group_no_and_offset(ac->ac_sb, pa->pa_pstart, in ext4_mb_use_group_pa()
3294 ac->ac_pa = pa; in ext4_mb_use_group_pa()
3302 mb_debug(1, "use %u/%u from group pa %p\n", pa->pa_lstart-len, len, pa); in ext4_mb_use_group_pa()
3313 struct ext4_prealloc_space *pa, in ext4_mb_check_group_pa() argument
3319 atomic_inc(&pa->pa_count); in ext4_mb_check_group_pa()
3320 return pa; in ext4_mb_check_group_pa()
3323 new_distance = abs(goal_block - pa->pa_pstart); in ext4_mb_check_group_pa()
3330 atomic_inc(&pa->pa_count); in ext4_mb_check_group_pa()
3331 return pa; in ext4_mb_check_group_pa()
3344 struct ext4_prealloc_space *pa, *cpa = NULL; in ext4_mb_use_preallocated() local
3353 list_for_each_entry_rcu(pa, &ei->i_prealloc_list, pa_inode_list) { in ext4_mb_use_preallocated()
3357 if (ac->ac_o_ex.fe_logical < pa->pa_lstart || in ext4_mb_use_preallocated()
3358 ac->ac_o_ex.fe_logical >= (pa->pa_lstart + in ext4_mb_use_preallocated()
3359 EXT4_C2B(sbi, pa->pa_len))) in ext4_mb_use_preallocated()
3364 (pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len) > in ext4_mb_use_preallocated()
3369 spin_lock(&pa->pa_lock); in ext4_mb_use_preallocated()
3370 if (pa->pa_deleted == 0 && pa->pa_free) { in ext4_mb_use_preallocated()
3371 atomic_inc(&pa->pa_count); in ext4_mb_use_preallocated()
3372 ext4_mb_use_inode_pa(ac, pa); in ext4_mb_use_preallocated()
3373 spin_unlock(&pa->pa_lock); in ext4_mb_use_preallocated()
3378 spin_unlock(&pa->pa_lock); in ext4_mb_use_preallocated()
3402 list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[i], in ext4_mb_use_preallocated()
3404 spin_lock(&pa->pa_lock); in ext4_mb_use_preallocated()
3405 if (pa->pa_deleted == 0 && in ext4_mb_use_preallocated()
3406 pa->pa_free >= ac->ac_o_ex.fe_len) { in ext4_mb_use_preallocated()
3409 pa, cpa); in ext4_mb_use_preallocated()
3411 spin_unlock(&pa->pa_lock); in ext4_mb_use_preallocated()
3457 struct ext4_prealloc_space *pa; in ext4_mb_generate_from_pa() local
3473 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in ext4_mb_generate_from_pa()
3474 spin_lock(&pa->pa_lock); in ext4_mb_generate_from_pa()
3475 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_generate_from_pa()
3477 len = pa->pa_len; in ext4_mb_generate_from_pa()
3478 spin_unlock(&pa->pa_lock); in ext4_mb_generate_from_pa()
3490 struct ext4_prealloc_space *pa; in ext4_mb_pa_callback() local
3491 pa = container_of(head, struct ext4_prealloc_space, u.pa_rcu); in ext4_mb_pa_callback()
3493 BUG_ON(atomic_read(&pa->pa_count)); in ext4_mb_pa_callback()
3494 BUG_ON(pa->pa_deleted == 0); in ext4_mb_pa_callback()
3495 kmem_cache_free(ext4_pspace_cachep, pa); in ext4_mb_pa_callback()
3503 struct super_block *sb, struct ext4_prealloc_space *pa) in ext4_mb_put_pa() argument
3509 spin_lock(&pa->pa_lock); in ext4_mb_put_pa()
3510 if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0) { in ext4_mb_put_pa()
3511 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
3515 if (pa->pa_deleted == 1) { in ext4_mb_put_pa()
3516 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
3520 pa->pa_deleted = 1; in ext4_mb_put_pa()
3521 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
3523 grp_blk = pa->pa_pstart; in ext4_mb_put_pa()
3528 if (pa->pa_type == MB_GROUP_PA) in ext4_mb_put_pa()
3548 list_del(&pa->pa_group_list); in ext4_mb_put_pa()
3551 spin_lock(pa->pa_obj_lock); in ext4_mb_put_pa()
3552 list_del_rcu(&pa->pa_inode_list); in ext4_mb_put_pa()
3553 spin_unlock(pa->pa_obj_lock); in ext4_mb_put_pa()
3555 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_put_pa()
3566 struct ext4_prealloc_space *pa; in ext4_mb_new_inode_pa() local
3575 pa = kmem_cache_alloc(ext4_pspace_cachep, GFP_NOFS); in ext4_mb_new_inode_pa()
3576 if (pa == NULL) in ext4_mb_new_inode_pa()
3617 pa->pa_lstart = ac->ac_b_ex.fe_logical; 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()
3619 pa->pa_len = ac->ac_b_ex.fe_len; in ext4_mb_new_inode_pa()
3620 pa->pa_free = pa->pa_len; in ext4_mb_new_inode_pa()
3621 atomic_set(&pa->pa_count, 1); in ext4_mb_new_inode_pa()
3622 spin_lock_init(&pa->pa_lock); in ext4_mb_new_inode_pa()
3623 INIT_LIST_HEAD(&pa->pa_inode_list); in ext4_mb_new_inode_pa()
3624 INIT_LIST_HEAD(&pa->pa_group_list); in ext4_mb_new_inode_pa()
3625 pa->pa_deleted = 0; in ext4_mb_new_inode_pa()
3626 pa->pa_type = MB_INODE_PA; in ext4_mb_new_inode_pa()
3628 mb_debug(1, "new inode pa %p: %llu/%u for %u\n", pa, in ext4_mb_new_inode_pa()
3629 pa->pa_pstart, pa->pa_len, pa->pa_lstart); in ext4_mb_new_inode_pa()
3630 trace_ext4_mb_new_inode_pa(ac, pa); in ext4_mb_new_inode_pa()
3632 ext4_mb_use_inode_pa(ac, pa); in ext4_mb_new_inode_pa()
3633 atomic_add(pa->pa_free, &sbi->s_mb_preallocated); in ext4_mb_new_inode_pa()
3638 pa->pa_obj_lock = &ei->i_prealloc_lock; in ext4_mb_new_inode_pa()
3639 pa->pa_inode = ac->ac_inode; in ext4_mb_new_inode_pa()
3642 list_add(&pa->pa_group_list, &grp->bb_prealloc_list); in ext4_mb_new_inode_pa()
3645 spin_lock(pa->pa_obj_lock); in ext4_mb_new_inode_pa()
3646 list_add_rcu(&pa->pa_inode_list, &ei->i_prealloc_list); in ext4_mb_new_inode_pa()
3647 spin_unlock(pa->pa_obj_lock); in ext4_mb_new_inode_pa()
3660 struct ext4_prealloc_space *pa; in ext4_mb_new_group_pa() local
3669 pa = kmem_cache_alloc(ext4_pspace_cachep, GFP_NOFS); in ext4_mb_new_group_pa()
3670 if (pa == NULL) in ext4_mb_new_group_pa()
3677 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_group_pa()
3678 pa->pa_lstart = pa->pa_pstart; in ext4_mb_new_group_pa()
3679 pa->pa_len = ac->ac_b_ex.fe_len; in ext4_mb_new_group_pa()
3680 pa->pa_free = pa->pa_len; in ext4_mb_new_group_pa()
3681 atomic_set(&pa->pa_count, 1); in ext4_mb_new_group_pa()
3682 spin_lock_init(&pa->pa_lock); in ext4_mb_new_group_pa()
3683 INIT_LIST_HEAD(&pa->pa_inode_list); in ext4_mb_new_group_pa()
3684 INIT_LIST_HEAD(&pa->pa_group_list); in ext4_mb_new_group_pa()
3685 pa->pa_deleted = 0; in ext4_mb_new_group_pa()
3686 pa->pa_type = MB_GROUP_PA; in ext4_mb_new_group_pa()
3688 mb_debug(1, "new group pa %p: %llu/%u for %u\n", pa, in ext4_mb_new_group_pa()
3689 pa->pa_pstart, pa->pa_len, pa->pa_lstart); in ext4_mb_new_group_pa()
3690 trace_ext4_mb_new_group_pa(ac, pa); in ext4_mb_new_group_pa()
3692 ext4_mb_use_group_pa(ac, pa); in ext4_mb_new_group_pa()
3693 atomic_add(pa->pa_free, &EXT4_SB(sb)->s_mb_preallocated); in ext4_mb_new_group_pa()
3699 pa->pa_obj_lock = &lg->lg_prealloc_lock; in ext4_mb_new_group_pa()
3700 pa->pa_inode = NULL; in ext4_mb_new_group_pa()
3703 list_add(&pa->pa_group_list, &grp->bb_prealloc_list); in ext4_mb_new_group_pa()
3734 struct ext4_prealloc_space *pa) in ext4_mb_release_inode_pa() argument
3746 BUG_ON(pa->pa_deleted == 0); 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()
3748 grp_blk_start = pa->pa_pstart - EXT4_C2B(sbi, bit); in ext4_mb_release_inode_pa()
3749 BUG_ON(group != e4b->bd_group && pa->pa_len != 0); in ext4_mb_release_inode_pa()
3750 end = bit + pa->pa_len; in ext4_mb_release_inode_pa()
3763 trace_ext4_mb_release_inode_pa(pa, (grp_blk_start + in ext4_mb_release_inode_pa()
3766 mb_free_blocks(pa->pa_inode, e4b, bit, next - bit); in ext4_mb_release_inode_pa()
3769 if (free != pa->pa_free) { in ext4_mb_release_inode_pa()
3772 pa, (unsigned long) pa->pa_lstart, in ext4_mb_release_inode_pa()
3773 (unsigned long) pa->pa_pstart, in ext4_mb_release_inode_pa()
3774 (unsigned long) pa->pa_len); in ext4_mb_release_inode_pa()
3776 free, pa->pa_free); in ext4_mb_release_inode_pa()
3789 struct ext4_prealloc_space *pa) in ext4_mb_release_group_pa() argument
3795 trace_ext4_mb_release_group_pa(sb, pa); in ext4_mb_release_group_pa()
3796 BUG_ON(pa->pa_deleted == 0); 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()
3798 BUG_ON(group != e4b->bd_group && pa->pa_len != 0); in ext4_mb_release_group_pa()
3799 mb_free_blocks(pa->pa_inode, e4b, bit, pa->pa_len); 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()
3821 struct ext4_prealloc_space *pa, *tmp; in ext4_mb_discard_group_preallocations() local
3852 list_for_each_entry_safe(pa, tmp, in ext4_mb_discard_group_preallocations()
3854 spin_lock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3855 if (atomic_read(&pa->pa_count)) { in ext4_mb_discard_group_preallocations()
3856 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3860 if (pa->pa_deleted) { in ext4_mb_discard_group_preallocations()
3861 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3866 pa->pa_deleted = 1; in ext4_mb_discard_group_preallocations()
3869 free += pa->pa_free; in ext4_mb_discard_group_preallocations()
3871 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3873 list_del(&pa->pa_group_list); in ext4_mb_discard_group_preallocations()
3874 list_add(&pa->u.pa_tmp_list, &list); in ext4_mb_discard_group_preallocations()
3892 list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) { in ext4_mb_discard_group_preallocations()
3895 spin_lock(pa->pa_obj_lock); in ext4_mb_discard_group_preallocations()
3896 list_del_rcu(&pa->pa_inode_list); in ext4_mb_discard_group_preallocations()
3897 spin_unlock(pa->pa_obj_lock); in ext4_mb_discard_group_preallocations()
3899 if (pa->pa_type == MB_GROUP_PA) in ext4_mb_discard_group_preallocations()
3900 ext4_mb_release_group_pa(&e4b, pa); in ext4_mb_discard_group_preallocations()
3902 ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa); in ext4_mb_discard_group_preallocations()
3904 list_del(&pa->u.pa_tmp_list); in ext4_mb_discard_group_preallocations()
3905 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_discard_group_preallocations()
3929 struct ext4_prealloc_space *pa, *tmp; in ext4_discard_preallocations() local
3949 pa = list_entry(ei->i_prealloc_list.next, in ext4_discard_preallocations()
3951 BUG_ON(pa->pa_obj_lock != &ei->i_prealloc_lock); in ext4_discard_preallocations()
3952 spin_lock(&pa->pa_lock); in ext4_discard_preallocations()
3953 if (atomic_read(&pa->pa_count)) { in ext4_discard_preallocations()
3956 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
3965 if (pa->pa_deleted == 0) { in ext4_discard_preallocations()
3966 pa->pa_deleted = 1; in ext4_discard_preallocations()
3967 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
3968 list_del_rcu(&pa->pa_inode_list); in ext4_discard_preallocations()
3969 list_add(&pa->u.pa_tmp_list, &list); in ext4_discard_preallocations()
3974 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
3994 list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) { in ext4_discard_preallocations()
3995 BUG_ON(pa->pa_type != MB_INODE_PA); in ext4_discard_preallocations()
3996 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_discard_preallocations()
4014 list_del(&pa->pa_group_list); in ext4_discard_preallocations()
4015 ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa); in ext4_discard_preallocations()
4021 list_del(&pa->u.pa_tmp_list); in ext4_discard_preallocations()
4022 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_discard_preallocations()
4061 struct ext4_prealloc_space *pa; in ext4_mb_show_ac() local
4066 pa = list_entry(cur, struct ext4_prealloc_space, in ext4_mb_show_ac()
4068 spin_lock(&pa->pa_lock); in ext4_mb_show_ac()
4069 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_show_ac()
4071 spin_unlock(&pa->pa_lock); in ext4_mb_show_ac()
4073 start, pa->pa_len); in ext4_mb_show_ac()
4209 struct ext4_prealloc_space *pa, *tmp; in ext4_mb_discard_lg_preallocations() local
4216 list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[order], in ext4_mb_discard_lg_preallocations()
4218 spin_lock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4219 if (atomic_read(&pa->pa_count)) { in ext4_mb_discard_lg_preallocations()
4225 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4228 if (pa->pa_deleted) { in ext4_mb_discard_lg_preallocations()
4229 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4233 BUG_ON(pa->pa_type != MB_GROUP_PA); in ext4_mb_discard_lg_preallocations()
4236 pa->pa_deleted = 1; in ext4_mb_discard_lg_preallocations()
4237 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4239 list_del_rcu(&pa->pa_inode_list); in ext4_mb_discard_lg_preallocations()
4240 list_add(&pa->u.pa_tmp_list, &discard_list); in ext4_mb_discard_lg_preallocations()
4255 list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) { in ext4_mb_discard_lg_preallocations()
4257 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_mb_discard_lg_preallocations()
4264 list_del(&pa->pa_group_list); in ext4_mb_discard_lg_preallocations()
4265 ext4_mb_release_group_pa(&e4b, pa); in ext4_mb_discard_lg_preallocations()
4269 list_del(&pa->u.pa_tmp_list); in ext4_mb_discard_lg_preallocations()
4270 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_discard_lg_preallocations()
4288 struct ext4_prealloc_space *tmp_pa, *pa = ac->ac_pa; in ext4_mb_add_n_trim() local
4290 order = fls(pa->pa_free) - 1; in ext4_mb_add_n_trim()
4303 if (!added && pa->pa_free < tmp_pa->pa_free) { in ext4_mb_add_n_trim()
4305 list_add_tail_rcu(&pa->pa_inode_list, in ext4_mb_add_n_trim()
4317 list_add_tail_rcu(&pa->pa_inode_list, in ext4_mb_add_n_trim()
4336 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_mb_release_context() local
4337 if (pa) { in ext4_mb_release_context()
4338 if (pa->pa_type == MB_GROUP_PA) { in ext4_mb_release_context()
4340 spin_lock(&pa->pa_lock); in ext4_mb_release_context()
4341 pa->pa_pstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len); in ext4_mb_release_context()
4342 pa->pa_lstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len); in ext4_mb_release_context()
4343 pa->pa_free -= ac->ac_b_ex.fe_len; in ext4_mb_release_context()
4344 pa->pa_len -= ac->ac_b_ex.fe_len; in ext4_mb_release_context()
4345 spin_unlock(&pa->pa_lock); in ext4_mb_release_context()
4348 if (pa) { in ext4_mb_release_context()
4355 if ((pa->pa_type == MB_GROUP_PA) && likely(pa->pa_free)) { in ext4_mb_release_context()
4356 spin_lock(pa->pa_obj_lock); in ext4_mb_release_context()
4357 list_del_rcu(&pa->pa_inode_list); in ext4_mb_release_context()
4358 spin_unlock(pa->pa_obj_lock); in ext4_mb_release_context()
4361 ext4_mb_put_pa(ac, ac->ac_sb, pa); in ext4_mb_release_context()