Lines Matching refs:pa

642 		struct ext4_prealloc_space *pa;  in __mb_check_buddy()  local
643 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in __mb_check_buddy()
644 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &groupnr, &k); in __mb_check_buddy()
646 for (i = 0; i < pa->pa_len; i++) in __mb_check_buddy()
2691 struct ext4_prealloc_space *pa; in ext4_mb_cleanup_pa() local
2696 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in ext4_mb_cleanup_pa()
2697 list_del(&pa->pa_group_list); in ext4_mb_cleanup_pa()
2699 kmem_cache_free(ext4_pspace_cachep, pa); in ext4_mb_cleanup_pa()
3033 struct ext4_prealloc_space *pa; in ext4_mb_normalize_request() local
3120 list_for_each_entry_rcu(pa, &ei->i_prealloc_list, pa_inode_list) { in ext4_mb_normalize_request()
3123 if (pa->pa_deleted) in ext4_mb_normalize_request()
3125 spin_lock(&pa->pa_lock); in ext4_mb_normalize_request()
3126 if (pa->pa_deleted) { in ext4_mb_normalize_request()
3127 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3131 pa_end = pa->pa_lstart + EXT4_C2B(EXT4_SB(ac->ac_sb), in ext4_mb_normalize_request()
3132 pa->pa_len); in ext4_mb_normalize_request()
3136 ac->ac_o_ex.fe_logical < pa->pa_lstart)); in ext4_mb_normalize_request()
3139 if (pa->pa_lstart >= end || pa_end <= start) { in ext4_mb_normalize_request()
3140 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3143 BUG_ON(pa->pa_lstart <= start && pa_end >= end); in ext4_mb_normalize_request()
3149 } else if (pa->pa_lstart > ac->ac_o_ex.fe_logical) { in ext4_mb_normalize_request()
3150 BUG_ON(pa->pa_lstart > end); in ext4_mb_normalize_request()
3151 end = pa->pa_lstart; in ext4_mb_normalize_request()
3153 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3160 list_for_each_entry_rcu(pa, &ei->i_prealloc_list, pa_inode_list) { in ext4_mb_normalize_request()
3163 spin_lock(&pa->pa_lock); in ext4_mb_normalize_request()
3164 if (pa->pa_deleted == 0) { in ext4_mb_normalize_request()
3165 pa_end = pa->pa_lstart + EXT4_C2B(EXT4_SB(ac->ac_sb), in ext4_mb_normalize_request()
3166 pa->pa_len); in ext4_mb_normalize_request()
3167 BUG_ON(!(start >= pa_end || end <= pa->pa_lstart)); in ext4_mb_normalize_request()
3169 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3241 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_discard_allocated_blocks() local
3245 if (pa == NULL) { in ext4_discard_allocated_blocks()
3265 if (pa->pa_type == MB_INODE_PA) in ext4_discard_allocated_blocks()
3266 pa->pa_free += ac->ac_b_ex.fe_len; in ext4_discard_allocated_blocks()
3273 struct ext4_prealloc_space *pa) in ext4_mb_use_inode_pa() argument
3281 start = pa->pa_pstart + (ac->ac_o_ex.fe_logical - pa->pa_lstart); in ext4_mb_use_inode_pa()
3282 end = min(pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len), in ext4_mb_use_inode_pa()
3289 ac->ac_pa = pa; in ext4_mb_use_inode_pa()
3291 BUG_ON(start < pa->pa_pstart); in ext4_mb_use_inode_pa()
3292 BUG_ON(end > pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len)); in ext4_mb_use_inode_pa()
3293 BUG_ON(pa->pa_free < len); in ext4_mb_use_inode_pa()
3294 pa->pa_free -= len; in ext4_mb_use_inode_pa()
3296 mb_debug(1, "use %llu/%u from inode pa %p\n", start, len, pa); in ext4_mb_use_inode_pa()
3303 struct ext4_prealloc_space *pa) in ext4_mb_use_group_pa() argument
3307 ext4_get_group_no_and_offset(ac->ac_sb, pa->pa_pstart, in ext4_mb_use_group_pa()
3312 ac->ac_pa = pa; in ext4_mb_use_group_pa()
3320 mb_debug(1, "use %u/%u from group pa %p\n", pa->pa_lstart-len, len, pa); in ext4_mb_use_group_pa()
3331 struct ext4_prealloc_space *pa, in ext4_mb_check_group_pa() argument
3337 atomic_inc(&pa->pa_count); in ext4_mb_check_group_pa()
3338 return pa; in ext4_mb_check_group_pa()
3341 new_distance = abs(goal_block - pa->pa_pstart); in ext4_mb_check_group_pa()
3348 atomic_inc(&pa->pa_count); in ext4_mb_check_group_pa()
3349 return pa; in ext4_mb_check_group_pa()
3362 struct ext4_prealloc_space *pa, *cpa = NULL; in ext4_mb_use_preallocated() local
3371 list_for_each_entry_rcu(pa, &ei->i_prealloc_list, pa_inode_list) { in ext4_mb_use_preallocated()
3375 if (ac->ac_o_ex.fe_logical < pa->pa_lstart || in ext4_mb_use_preallocated()
3376 ac->ac_o_ex.fe_logical >= (pa->pa_lstart + in ext4_mb_use_preallocated()
3377 EXT4_C2B(sbi, pa->pa_len))) in ext4_mb_use_preallocated()
3382 (pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len) > in ext4_mb_use_preallocated()
3387 spin_lock(&pa->pa_lock); in ext4_mb_use_preallocated()
3388 if (pa->pa_deleted == 0 && pa->pa_free) { in ext4_mb_use_preallocated()
3389 atomic_inc(&pa->pa_count); in ext4_mb_use_preallocated()
3390 ext4_mb_use_inode_pa(ac, pa); in ext4_mb_use_preallocated()
3391 spin_unlock(&pa->pa_lock); in ext4_mb_use_preallocated()
3396 spin_unlock(&pa->pa_lock); in ext4_mb_use_preallocated()
3420 list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[i], in ext4_mb_use_preallocated()
3422 spin_lock(&pa->pa_lock); in ext4_mb_use_preallocated()
3423 if (pa->pa_deleted == 0 && in ext4_mb_use_preallocated()
3424 pa->pa_free >= ac->ac_o_ex.fe_len) { in ext4_mb_use_preallocated()
3427 pa, cpa); in ext4_mb_use_preallocated()
3429 spin_unlock(&pa->pa_lock); in ext4_mb_use_preallocated()
3475 struct ext4_prealloc_space *pa; in ext4_mb_generate_from_pa() local
3491 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in ext4_mb_generate_from_pa()
3492 spin_lock(&pa->pa_lock); in ext4_mb_generate_from_pa()
3493 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_generate_from_pa()
3495 len = pa->pa_len; in ext4_mb_generate_from_pa()
3496 spin_unlock(&pa->pa_lock); in ext4_mb_generate_from_pa()
3508 struct ext4_prealloc_space *pa; in ext4_mb_pa_callback() local
3509 pa = container_of(head, struct ext4_prealloc_space, u.pa_rcu); in ext4_mb_pa_callback()
3511 BUG_ON(atomic_read(&pa->pa_count)); in ext4_mb_pa_callback()
3512 BUG_ON(pa->pa_deleted == 0); in ext4_mb_pa_callback()
3513 kmem_cache_free(ext4_pspace_cachep, pa); in ext4_mb_pa_callback()
3521 struct super_block *sb, struct ext4_prealloc_space *pa) in ext4_mb_put_pa() argument
3527 spin_lock(&pa->pa_lock); in ext4_mb_put_pa()
3528 if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0) { in ext4_mb_put_pa()
3529 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
3533 if (pa->pa_deleted == 1) { in ext4_mb_put_pa()
3534 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
3538 pa->pa_deleted = 1; in ext4_mb_put_pa()
3539 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
3541 grp_blk = pa->pa_pstart; in ext4_mb_put_pa()
3546 if (pa->pa_type == MB_GROUP_PA) in ext4_mb_put_pa()
3566 list_del(&pa->pa_group_list); in ext4_mb_put_pa()
3569 spin_lock(pa->pa_obj_lock); in ext4_mb_put_pa()
3570 list_del_rcu(&pa->pa_inode_list); in ext4_mb_put_pa()
3571 spin_unlock(pa->pa_obj_lock); in ext4_mb_put_pa()
3573 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_put_pa()
3584 struct ext4_prealloc_space *pa; in ext4_mb_new_inode_pa() local
3593 pa = kmem_cache_alloc(ext4_pspace_cachep, GFP_NOFS); in ext4_mb_new_inode_pa()
3594 if (pa == NULL) in ext4_mb_new_inode_pa()
3635 pa->pa_lstart = ac->ac_b_ex.fe_logical; 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()
3637 pa->pa_len = ac->ac_b_ex.fe_len; in ext4_mb_new_inode_pa()
3638 pa->pa_free = pa->pa_len; in ext4_mb_new_inode_pa()
3639 atomic_set(&pa->pa_count, 1); in ext4_mb_new_inode_pa()
3640 spin_lock_init(&pa->pa_lock); in ext4_mb_new_inode_pa()
3641 INIT_LIST_HEAD(&pa->pa_inode_list); in ext4_mb_new_inode_pa()
3642 INIT_LIST_HEAD(&pa->pa_group_list); in ext4_mb_new_inode_pa()
3643 pa->pa_deleted = 0; in ext4_mb_new_inode_pa()
3644 pa->pa_type = MB_INODE_PA; in ext4_mb_new_inode_pa()
3646 mb_debug(1, "new inode pa %p: %llu/%u for %u\n", pa, in ext4_mb_new_inode_pa()
3647 pa->pa_pstart, pa->pa_len, pa->pa_lstart); in ext4_mb_new_inode_pa()
3648 trace_ext4_mb_new_inode_pa(ac, pa); in ext4_mb_new_inode_pa()
3650 ext4_mb_use_inode_pa(ac, pa); in ext4_mb_new_inode_pa()
3651 atomic_add(pa->pa_free, &sbi->s_mb_preallocated); in ext4_mb_new_inode_pa()
3656 pa->pa_obj_lock = &ei->i_prealloc_lock; in ext4_mb_new_inode_pa()
3657 pa->pa_inode = ac->ac_inode; in ext4_mb_new_inode_pa()
3660 list_add(&pa->pa_group_list, &grp->bb_prealloc_list); in ext4_mb_new_inode_pa()
3663 spin_lock(pa->pa_obj_lock); in ext4_mb_new_inode_pa()
3664 list_add_rcu(&pa->pa_inode_list, &ei->i_prealloc_list); in ext4_mb_new_inode_pa()
3665 spin_unlock(pa->pa_obj_lock); in ext4_mb_new_inode_pa()
3678 struct ext4_prealloc_space *pa; in ext4_mb_new_group_pa() local
3687 pa = kmem_cache_alloc(ext4_pspace_cachep, GFP_NOFS); in ext4_mb_new_group_pa()
3688 if (pa == NULL) in ext4_mb_new_group_pa()
3695 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_group_pa()
3696 pa->pa_lstart = pa->pa_pstart; in ext4_mb_new_group_pa()
3697 pa->pa_len = ac->ac_b_ex.fe_len; in ext4_mb_new_group_pa()
3698 pa->pa_free = pa->pa_len; in ext4_mb_new_group_pa()
3699 atomic_set(&pa->pa_count, 1); in ext4_mb_new_group_pa()
3700 spin_lock_init(&pa->pa_lock); in ext4_mb_new_group_pa()
3701 INIT_LIST_HEAD(&pa->pa_inode_list); in ext4_mb_new_group_pa()
3702 INIT_LIST_HEAD(&pa->pa_group_list); in ext4_mb_new_group_pa()
3703 pa->pa_deleted = 0; in ext4_mb_new_group_pa()
3704 pa->pa_type = MB_GROUP_PA; in ext4_mb_new_group_pa()
3706 mb_debug(1, "new group pa %p: %llu/%u for %u\n", pa, in ext4_mb_new_group_pa()
3707 pa->pa_pstart, pa->pa_len, pa->pa_lstart); in ext4_mb_new_group_pa()
3708 trace_ext4_mb_new_group_pa(ac, pa); in ext4_mb_new_group_pa()
3710 ext4_mb_use_group_pa(ac, pa); in ext4_mb_new_group_pa()
3711 atomic_add(pa->pa_free, &EXT4_SB(sb)->s_mb_preallocated); in ext4_mb_new_group_pa()
3717 pa->pa_obj_lock = &lg->lg_prealloc_lock; in ext4_mb_new_group_pa()
3718 pa->pa_inode = NULL; in ext4_mb_new_group_pa()
3721 list_add(&pa->pa_group_list, &grp->bb_prealloc_list); in ext4_mb_new_group_pa()
3752 struct ext4_prealloc_space *pa) in ext4_mb_release_inode_pa() argument
3764 BUG_ON(pa->pa_deleted == 0); 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()
3766 grp_blk_start = pa->pa_pstart - EXT4_C2B(sbi, bit); in ext4_mb_release_inode_pa()
3767 BUG_ON(group != e4b->bd_group && pa->pa_len != 0); in ext4_mb_release_inode_pa()
3768 end = bit + pa->pa_len; in ext4_mb_release_inode_pa()
3781 trace_ext4_mb_release_inode_pa(pa, (grp_blk_start + in ext4_mb_release_inode_pa()
3784 mb_free_blocks(pa->pa_inode, e4b, bit, next - bit); in ext4_mb_release_inode_pa()
3787 if (free != pa->pa_free) { in ext4_mb_release_inode_pa()
3790 pa, (unsigned long) pa->pa_lstart, in ext4_mb_release_inode_pa()
3791 (unsigned long) pa->pa_pstart, in ext4_mb_release_inode_pa()
3792 (unsigned long) pa->pa_len); in ext4_mb_release_inode_pa()
3794 free, pa->pa_free); in ext4_mb_release_inode_pa()
3807 struct ext4_prealloc_space *pa) in ext4_mb_release_group_pa() argument
3813 trace_ext4_mb_release_group_pa(sb, pa); in ext4_mb_release_group_pa()
3814 BUG_ON(pa->pa_deleted == 0); 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()
3816 BUG_ON(group != e4b->bd_group && pa->pa_len != 0); in ext4_mb_release_group_pa()
3817 mb_free_blocks(pa->pa_inode, e4b, bit, pa->pa_len); 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()
3839 struct ext4_prealloc_space *pa, *tmp; in ext4_mb_discard_group_preallocations() local
3872 list_for_each_entry_safe(pa, tmp, in ext4_mb_discard_group_preallocations()
3874 spin_lock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3875 if (atomic_read(&pa->pa_count)) { in ext4_mb_discard_group_preallocations()
3876 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3880 if (pa->pa_deleted) { in ext4_mb_discard_group_preallocations()
3881 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3886 pa->pa_deleted = 1; in ext4_mb_discard_group_preallocations()
3889 free += pa->pa_free; in ext4_mb_discard_group_preallocations()
3891 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3893 list_del(&pa->pa_group_list); in ext4_mb_discard_group_preallocations()
3894 list_add(&pa->u.pa_tmp_list, &list); in ext4_mb_discard_group_preallocations()
3912 list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) { in ext4_mb_discard_group_preallocations()
3915 spin_lock(pa->pa_obj_lock); in ext4_mb_discard_group_preallocations()
3916 list_del_rcu(&pa->pa_inode_list); in ext4_mb_discard_group_preallocations()
3917 spin_unlock(pa->pa_obj_lock); in ext4_mb_discard_group_preallocations()
3919 if (pa->pa_type == MB_GROUP_PA) in ext4_mb_discard_group_preallocations()
3920 ext4_mb_release_group_pa(&e4b, pa); in ext4_mb_discard_group_preallocations()
3922 ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa); in ext4_mb_discard_group_preallocations()
3924 list_del(&pa->u.pa_tmp_list); in ext4_mb_discard_group_preallocations()
3925 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_discard_group_preallocations()
3949 struct ext4_prealloc_space *pa, *tmp; in ext4_discard_preallocations() local
3969 pa = list_entry(ei->i_prealloc_list.next, in ext4_discard_preallocations()
3971 BUG_ON(pa->pa_obj_lock != &ei->i_prealloc_lock); in ext4_discard_preallocations()
3972 spin_lock(&pa->pa_lock); in ext4_discard_preallocations()
3973 if (atomic_read(&pa->pa_count)) { in ext4_discard_preallocations()
3976 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
3985 if (pa->pa_deleted == 0) { in ext4_discard_preallocations()
3986 pa->pa_deleted = 1; in ext4_discard_preallocations()
3987 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
3988 list_del_rcu(&pa->pa_inode_list); in ext4_discard_preallocations()
3989 list_add(&pa->u.pa_tmp_list, &list); in ext4_discard_preallocations()
3994 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
4014 list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) { in ext4_discard_preallocations()
4015 BUG_ON(pa->pa_type != MB_INODE_PA); in ext4_discard_preallocations()
4016 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_discard_preallocations()
4035 list_del(&pa->pa_group_list); in ext4_discard_preallocations()
4036 ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa); in ext4_discard_preallocations()
4042 list_del(&pa->u.pa_tmp_list); in ext4_discard_preallocations()
4043 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_discard_preallocations()
4082 struct ext4_prealloc_space *pa; in ext4_mb_show_ac() local
4087 pa = list_entry(cur, struct ext4_prealloc_space, in ext4_mb_show_ac()
4089 spin_lock(&pa->pa_lock); in ext4_mb_show_ac()
4090 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_show_ac()
4092 spin_unlock(&pa->pa_lock); in ext4_mb_show_ac()
4094 start, pa->pa_len); in ext4_mb_show_ac()
4230 struct ext4_prealloc_space *pa, *tmp; in ext4_mb_discard_lg_preallocations() local
4237 list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[order], in ext4_mb_discard_lg_preallocations()
4239 spin_lock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4240 if (atomic_read(&pa->pa_count)) { in ext4_mb_discard_lg_preallocations()
4246 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4249 if (pa->pa_deleted) { in ext4_mb_discard_lg_preallocations()
4250 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4254 BUG_ON(pa->pa_type != MB_GROUP_PA); in ext4_mb_discard_lg_preallocations()
4257 pa->pa_deleted = 1; in ext4_mb_discard_lg_preallocations()
4258 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4260 list_del_rcu(&pa->pa_inode_list); in ext4_mb_discard_lg_preallocations()
4261 list_add(&pa->u.pa_tmp_list, &discard_list); in ext4_mb_discard_lg_preallocations()
4276 list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) { in ext4_mb_discard_lg_preallocations()
4278 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_mb_discard_lg_preallocations()
4285 list_del(&pa->pa_group_list); in ext4_mb_discard_lg_preallocations()
4286 ext4_mb_release_group_pa(&e4b, pa); in ext4_mb_discard_lg_preallocations()
4290 list_del(&pa->u.pa_tmp_list); in ext4_mb_discard_lg_preallocations()
4291 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_discard_lg_preallocations()
4309 struct ext4_prealloc_space *tmp_pa, *pa = ac->ac_pa; in ext4_mb_add_n_trim() local
4311 order = fls(pa->pa_free) - 1; in ext4_mb_add_n_trim()
4324 if (!added && pa->pa_free < tmp_pa->pa_free) { in ext4_mb_add_n_trim()
4326 list_add_tail_rcu(&pa->pa_inode_list, in ext4_mb_add_n_trim()
4338 list_add_tail_rcu(&pa->pa_inode_list, in ext4_mb_add_n_trim()
4357 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_mb_release_context() local
4358 if (pa) { in ext4_mb_release_context()
4359 if (pa->pa_type == MB_GROUP_PA) { in ext4_mb_release_context()
4361 spin_lock(&pa->pa_lock); in ext4_mb_release_context()
4362 pa->pa_pstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len); in ext4_mb_release_context()
4363 pa->pa_lstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len); in ext4_mb_release_context()
4364 pa->pa_free -= ac->ac_b_ex.fe_len; in ext4_mb_release_context()
4365 pa->pa_len -= ac->ac_b_ex.fe_len; in ext4_mb_release_context()
4366 spin_unlock(&pa->pa_lock); in ext4_mb_release_context()
4369 if (pa) { in ext4_mb_release_context()
4376 if ((pa->pa_type == MB_GROUP_PA) && likely(pa->pa_free)) { in ext4_mb_release_context()
4377 spin_lock(pa->pa_obj_lock); in ext4_mb_release_context()
4378 list_del_rcu(&pa->pa_inode_list); in ext4_mb_release_context()
4379 spin_unlock(pa->pa_obj_lock); in ext4_mb_release_context()
4382 ext4_mb_put_pa(ac, ac->ac_sb, pa); in ext4_mb_release_context()