Lines Matching refs:pa
631 struct ext4_prealloc_space *pa; in __mb_check_buddy() local
632 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in __mb_check_buddy()
633 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &groupnr, &k); in __mb_check_buddy()
635 for (i = 0; i < pa->pa_len; i++) in __mb_check_buddy()
2683 struct ext4_prealloc_space *pa; in ext4_mb_cleanup_pa() local
2688 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in ext4_mb_cleanup_pa()
2689 list_del(&pa->pa_group_list); in ext4_mb_cleanup_pa()
2691 kmem_cache_free(ext4_pspace_cachep, pa); in ext4_mb_cleanup_pa()
3071 struct ext4_prealloc_space *pa; in ext4_mb_normalize_request() local
3165 list_for_each_entry_rcu(pa, &ei->i_prealloc_list, pa_inode_list) { in ext4_mb_normalize_request()
3168 if (pa->pa_deleted) in ext4_mb_normalize_request()
3170 spin_lock(&pa->pa_lock); in ext4_mb_normalize_request()
3171 if (pa->pa_deleted) { in ext4_mb_normalize_request()
3172 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3176 pa_end = pa->pa_lstart + EXT4_C2B(EXT4_SB(ac->ac_sb), in ext4_mb_normalize_request()
3177 pa->pa_len); in ext4_mb_normalize_request()
3181 ac->ac_o_ex.fe_logical < pa->pa_lstart)); in ext4_mb_normalize_request()
3184 if (pa->pa_lstart >= end || pa_end <= start) { in ext4_mb_normalize_request()
3185 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3188 BUG_ON(pa->pa_lstart <= start && pa_end >= end); in ext4_mb_normalize_request()
3194 } else if (pa->pa_lstart > ac->ac_o_ex.fe_logical) { in ext4_mb_normalize_request()
3195 BUG_ON(pa->pa_lstart > end); in ext4_mb_normalize_request()
3196 end = pa->pa_lstart; in ext4_mb_normalize_request()
3198 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3205 list_for_each_entry_rcu(pa, &ei->i_prealloc_list, pa_inode_list) { in ext4_mb_normalize_request()
3208 spin_lock(&pa->pa_lock); in ext4_mb_normalize_request()
3209 if (pa->pa_deleted == 0) { in ext4_mb_normalize_request()
3210 pa_end = pa->pa_lstart + EXT4_C2B(EXT4_SB(ac->ac_sb), in ext4_mb_normalize_request()
3211 pa->pa_len); in ext4_mb_normalize_request()
3212 BUG_ON(!(start >= pa_end || end <= pa->pa_lstart)); in ext4_mb_normalize_request()
3214 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3286 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_discard_allocated_blocks() local
3290 if (pa == NULL) { in ext4_discard_allocated_blocks()
3310 if (pa->pa_type == MB_INODE_PA) in ext4_discard_allocated_blocks()
3311 pa->pa_free += ac->ac_b_ex.fe_len; in ext4_discard_allocated_blocks()
3318 struct ext4_prealloc_space *pa) in ext4_mb_use_inode_pa() argument
3326 start = pa->pa_pstart + (ac->ac_o_ex.fe_logical - pa->pa_lstart); in ext4_mb_use_inode_pa()
3327 end = min(pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len), in ext4_mb_use_inode_pa()
3334 ac->ac_pa = pa; in ext4_mb_use_inode_pa()
3336 BUG_ON(start < pa->pa_pstart); in ext4_mb_use_inode_pa()
3337 BUG_ON(end > pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len)); in ext4_mb_use_inode_pa()
3338 BUG_ON(pa->pa_free < len); in ext4_mb_use_inode_pa()
3339 pa->pa_free -= len; in ext4_mb_use_inode_pa()
3341 mb_debug(1, "use %llu/%u from inode pa %p\n", start, len, pa); in ext4_mb_use_inode_pa()
3348 struct ext4_prealloc_space *pa) in ext4_mb_use_group_pa() argument
3352 ext4_get_group_no_and_offset(ac->ac_sb, pa->pa_pstart, in ext4_mb_use_group_pa()
3357 ac->ac_pa = pa; in ext4_mb_use_group_pa()
3365 mb_debug(1, "use %u/%u from group pa %p\n", pa->pa_lstart-len, len, pa); in ext4_mb_use_group_pa()
3376 struct ext4_prealloc_space *pa, in ext4_mb_check_group_pa() argument
3382 atomic_inc(&pa->pa_count); in ext4_mb_check_group_pa()
3383 return pa; in ext4_mb_check_group_pa()
3386 new_distance = abs(goal_block - pa->pa_pstart); in ext4_mb_check_group_pa()
3393 atomic_inc(&pa->pa_count); in ext4_mb_check_group_pa()
3394 return pa; in ext4_mb_check_group_pa()
3407 struct ext4_prealloc_space *pa, *cpa = NULL; in ext4_mb_use_preallocated() local
3416 list_for_each_entry_rcu(pa, &ei->i_prealloc_list, pa_inode_list) { in ext4_mb_use_preallocated()
3420 if (ac->ac_o_ex.fe_logical < pa->pa_lstart || in ext4_mb_use_preallocated()
3421 ac->ac_o_ex.fe_logical >= (pa->pa_lstart + in ext4_mb_use_preallocated()
3422 EXT4_C2B(sbi, pa->pa_len))) in ext4_mb_use_preallocated()
3427 (pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len) > in ext4_mb_use_preallocated()
3432 spin_lock(&pa->pa_lock); in ext4_mb_use_preallocated()
3433 if (pa->pa_deleted == 0 && pa->pa_free) { in ext4_mb_use_preallocated()
3434 atomic_inc(&pa->pa_count); in ext4_mb_use_preallocated()
3435 ext4_mb_use_inode_pa(ac, pa); in ext4_mb_use_preallocated()
3436 spin_unlock(&pa->pa_lock); in ext4_mb_use_preallocated()
3441 spin_unlock(&pa->pa_lock); in ext4_mb_use_preallocated()
3465 list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[i], in ext4_mb_use_preallocated()
3467 spin_lock(&pa->pa_lock); in ext4_mb_use_preallocated()
3468 if (pa->pa_deleted == 0 && in ext4_mb_use_preallocated()
3469 pa->pa_free >= ac->ac_o_ex.fe_len) { in ext4_mb_use_preallocated()
3472 pa, cpa); in ext4_mb_use_preallocated()
3474 spin_unlock(&pa->pa_lock); in ext4_mb_use_preallocated()
3520 struct ext4_prealloc_space *pa; in ext4_mb_generate_from_pa() local
3536 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in ext4_mb_generate_from_pa()
3537 spin_lock(&pa->pa_lock); in ext4_mb_generate_from_pa()
3538 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_generate_from_pa()
3540 len = pa->pa_len; in ext4_mb_generate_from_pa()
3541 spin_unlock(&pa->pa_lock); in ext4_mb_generate_from_pa()
3553 struct ext4_prealloc_space *pa; in ext4_mb_pa_callback() local
3554 pa = container_of(head, struct ext4_prealloc_space, u.pa_rcu); in ext4_mb_pa_callback()
3556 BUG_ON(atomic_read(&pa->pa_count)); in ext4_mb_pa_callback()
3557 BUG_ON(pa->pa_deleted == 0); in ext4_mb_pa_callback()
3558 kmem_cache_free(ext4_pspace_cachep, pa); in ext4_mb_pa_callback()
3566 struct super_block *sb, struct ext4_prealloc_space *pa) in ext4_mb_put_pa() argument
3572 spin_lock(&pa->pa_lock); in ext4_mb_put_pa()
3573 if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0) { in ext4_mb_put_pa()
3574 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
3578 if (pa->pa_deleted == 1) { in ext4_mb_put_pa()
3579 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
3583 pa->pa_deleted = 1; in ext4_mb_put_pa()
3584 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
3586 grp_blk = pa->pa_pstart; in ext4_mb_put_pa()
3591 if (pa->pa_type == MB_GROUP_PA) in ext4_mb_put_pa()
3611 list_del(&pa->pa_group_list); in ext4_mb_put_pa()
3614 spin_lock(pa->pa_obj_lock); in ext4_mb_put_pa()
3615 list_del_rcu(&pa->pa_inode_list); in ext4_mb_put_pa()
3616 spin_unlock(pa->pa_obj_lock); in ext4_mb_put_pa()
3618 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_put_pa()
3629 struct ext4_prealloc_space *pa; in ext4_mb_new_inode_pa() local
3638 pa = kmem_cache_alloc(ext4_pspace_cachep, GFP_NOFS); in ext4_mb_new_inode_pa()
3639 if (pa == NULL) in ext4_mb_new_inode_pa()
3680 pa->pa_lstart = ac->ac_b_ex.fe_logical; in ext4_mb_new_inode_pa()
3681 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_inode_pa()
3682 pa->pa_len = ac->ac_b_ex.fe_len; in ext4_mb_new_inode_pa()
3683 pa->pa_free = pa->pa_len; in ext4_mb_new_inode_pa()
3684 atomic_set(&pa->pa_count, 1); in ext4_mb_new_inode_pa()
3685 spin_lock_init(&pa->pa_lock); in ext4_mb_new_inode_pa()
3686 INIT_LIST_HEAD(&pa->pa_inode_list); in ext4_mb_new_inode_pa()
3687 INIT_LIST_HEAD(&pa->pa_group_list); in ext4_mb_new_inode_pa()
3688 pa->pa_deleted = 0; in ext4_mb_new_inode_pa()
3689 pa->pa_type = MB_INODE_PA; in ext4_mb_new_inode_pa()
3691 mb_debug(1, "new inode pa %p: %llu/%u for %u\n", pa, in ext4_mb_new_inode_pa()
3692 pa->pa_pstart, pa->pa_len, pa->pa_lstart); in ext4_mb_new_inode_pa()
3693 trace_ext4_mb_new_inode_pa(ac, pa); in ext4_mb_new_inode_pa()
3695 ext4_mb_use_inode_pa(ac, pa); in ext4_mb_new_inode_pa()
3696 atomic_add(pa->pa_free, &sbi->s_mb_preallocated); in ext4_mb_new_inode_pa()
3701 pa->pa_obj_lock = &ei->i_prealloc_lock; in ext4_mb_new_inode_pa()
3702 pa->pa_inode = ac->ac_inode; in ext4_mb_new_inode_pa()
3705 list_add(&pa->pa_group_list, &grp->bb_prealloc_list); in ext4_mb_new_inode_pa()
3708 spin_lock(pa->pa_obj_lock); in ext4_mb_new_inode_pa()
3709 list_add_rcu(&pa->pa_inode_list, &ei->i_prealloc_list); in ext4_mb_new_inode_pa()
3710 spin_unlock(pa->pa_obj_lock); in ext4_mb_new_inode_pa()
3723 struct ext4_prealloc_space *pa; in ext4_mb_new_group_pa() local
3732 pa = kmem_cache_alloc(ext4_pspace_cachep, GFP_NOFS); in ext4_mb_new_group_pa()
3733 if (pa == NULL) in ext4_mb_new_group_pa()
3740 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_group_pa()
3741 pa->pa_lstart = pa->pa_pstart; in ext4_mb_new_group_pa()
3742 pa->pa_len = ac->ac_b_ex.fe_len; in ext4_mb_new_group_pa()
3743 pa->pa_free = pa->pa_len; in ext4_mb_new_group_pa()
3744 atomic_set(&pa->pa_count, 1); in ext4_mb_new_group_pa()
3745 spin_lock_init(&pa->pa_lock); in ext4_mb_new_group_pa()
3746 INIT_LIST_HEAD(&pa->pa_inode_list); in ext4_mb_new_group_pa()
3747 INIT_LIST_HEAD(&pa->pa_group_list); in ext4_mb_new_group_pa()
3748 pa->pa_deleted = 0; in ext4_mb_new_group_pa()
3749 pa->pa_type = MB_GROUP_PA; in ext4_mb_new_group_pa()
3751 mb_debug(1, "new group pa %p: %llu/%u for %u\n", pa, in ext4_mb_new_group_pa()
3752 pa->pa_pstart, pa->pa_len, pa->pa_lstart); in ext4_mb_new_group_pa()
3753 trace_ext4_mb_new_group_pa(ac, pa); in ext4_mb_new_group_pa()
3755 ext4_mb_use_group_pa(ac, pa); in ext4_mb_new_group_pa()
3756 atomic_add(pa->pa_free, &EXT4_SB(sb)->s_mb_preallocated); in ext4_mb_new_group_pa()
3762 pa->pa_obj_lock = &lg->lg_prealloc_lock; in ext4_mb_new_group_pa()
3763 pa->pa_inode = NULL; in ext4_mb_new_group_pa()
3766 list_add(&pa->pa_group_list, &grp->bb_prealloc_list); in ext4_mb_new_group_pa()
3797 struct ext4_prealloc_space *pa) in ext4_mb_release_inode_pa() argument
3808 BUG_ON(pa->pa_deleted == 0); in ext4_mb_release_inode_pa()
3809 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); in ext4_mb_release_inode_pa()
3810 grp_blk_start = pa->pa_pstart - EXT4_C2B(sbi, bit); in ext4_mb_release_inode_pa()
3811 BUG_ON(group != e4b->bd_group && pa->pa_len != 0); in ext4_mb_release_inode_pa()
3812 end = bit + pa->pa_len; in ext4_mb_release_inode_pa()
3825 trace_ext4_mb_release_inode_pa(pa, (grp_blk_start + in ext4_mb_release_inode_pa()
3828 mb_free_blocks(pa->pa_inode, e4b, bit, next - bit); in ext4_mb_release_inode_pa()
3831 if (free != pa->pa_free) { in ext4_mb_release_inode_pa()
3834 pa, (unsigned long) pa->pa_lstart, in ext4_mb_release_inode_pa()
3835 (unsigned long) pa->pa_pstart, in ext4_mb_release_inode_pa()
3836 (unsigned long) pa->pa_len); in ext4_mb_release_inode_pa()
3838 free, pa->pa_free); in ext4_mb_release_inode_pa()
3851 struct ext4_prealloc_space *pa) in ext4_mb_release_group_pa() argument
3857 trace_ext4_mb_release_group_pa(sb, pa); in ext4_mb_release_group_pa()
3858 BUG_ON(pa->pa_deleted == 0); in ext4_mb_release_group_pa()
3859 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); in ext4_mb_release_group_pa()
3860 BUG_ON(group != e4b->bd_group && pa->pa_len != 0); in ext4_mb_release_group_pa()
3861 mb_free_blocks(pa->pa_inode, e4b, bit, pa->pa_len); in ext4_mb_release_group_pa()
3862 atomic_add(pa->pa_len, &EXT4_SB(sb)->s_mb_discarded); in ext4_mb_release_group_pa()
3863 trace_ext4_mballoc_discard(sb, NULL, group, bit, pa->pa_len); in ext4_mb_release_group_pa()
3883 struct ext4_prealloc_space *pa, *tmp; in ext4_mb_discard_group_preallocations() local
3917 list_for_each_entry_safe(pa, tmp, in ext4_mb_discard_group_preallocations()
3919 spin_lock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3920 if (atomic_read(&pa->pa_count)) { in ext4_mb_discard_group_preallocations()
3921 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3925 if (pa->pa_deleted) { in ext4_mb_discard_group_preallocations()
3926 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3931 pa->pa_deleted = 1; in ext4_mb_discard_group_preallocations()
3934 free += pa->pa_free; in ext4_mb_discard_group_preallocations()
3936 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3938 list_del(&pa->pa_group_list); in ext4_mb_discard_group_preallocations()
3939 list_add(&pa->u.pa_tmp_list, &list); in ext4_mb_discard_group_preallocations()
3957 list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) { in ext4_mb_discard_group_preallocations()
3960 spin_lock(pa->pa_obj_lock); in ext4_mb_discard_group_preallocations()
3961 list_del_rcu(&pa->pa_inode_list); in ext4_mb_discard_group_preallocations()
3962 spin_unlock(pa->pa_obj_lock); in ext4_mb_discard_group_preallocations()
3964 if (pa->pa_type == MB_GROUP_PA) in ext4_mb_discard_group_preallocations()
3965 ext4_mb_release_group_pa(&e4b, pa); in ext4_mb_discard_group_preallocations()
3967 ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa); in ext4_mb_discard_group_preallocations()
3969 list_del(&pa->u.pa_tmp_list); in ext4_mb_discard_group_preallocations()
3970 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_discard_group_preallocations()
3994 struct ext4_prealloc_space *pa, *tmp; in ext4_discard_preallocations() local
4014 pa = list_entry(ei->i_prealloc_list.next, in ext4_discard_preallocations()
4016 BUG_ON(pa->pa_obj_lock != &ei->i_prealloc_lock); in ext4_discard_preallocations()
4017 spin_lock(&pa->pa_lock); in ext4_discard_preallocations()
4018 if (atomic_read(&pa->pa_count)) { in ext4_discard_preallocations()
4021 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
4030 if (pa->pa_deleted == 0) { in ext4_discard_preallocations()
4031 pa->pa_deleted = 1; in ext4_discard_preallocations()
4032 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
4033 list_del_rcu(&pa->pa_inode_list); in ext4_discard_preallocations()
4034 list_add(&pa->u.pa_tmp_list, &list); in ext4_discard_preallocations()
4039 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
4059 list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) { in ext4_discard_preallocations()
4060 BUG_ON(pa->pa_type != MB_INODE_PA); in ext4_discard_preallocations()
4061 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_discard_preallocations()
4081 list_del(&pa->pa_group_list); in ext4_discard_preallocations()
4082 ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa); in ext4_discard_preallocations()
4088 list_del(&pa->u.pa_tmp_list); in ext4_discard_preallocations()
4089 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_discard_preallocations()
4128 struct ext4_prealloc_space *pa; in ext4_mb_show_ac() local
4133 pa = list_entry(cur, struct ext4_prealloc_space, in ext4_mb_show_ac()
4135 spin_lock(&pa->pa_lock); in ext4_mb_show_ac()
4136 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_show_ac()
4138 spin_unlock(&pa->pa_lock); in ext4_mb_show_ac()
4140 start, pa->pa_len); in ext4_mb_show_ac()
4275 struct ext4_prealloc_space *pa, *tmp; in ext4_mb_discard_lg_preallocations() local
4282 list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[order], in ext4_mb_discard_lg_preallocations()
4284 spin_lock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4285 if (atomic_read(&pa->pa_count)) { in ext4_mb_discard_lg_preallocations()
4291 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4294 if (pa->pa_deleted) { in ext4_mb_discard_lg_preallocations()
4295 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4299 BUG_ON(pa->pa_type != MB_GROUP_PA); in ext4_mb_discard_lg_preallocations()
4302 pa->pa_deleted = 1; in ext4_mb_discard_lg_preallocations()
4303 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4305 list_del_rcu(&pa->pa_inode_list); in ext4_mb_discard_lg_preallocations()
4306 list_add(&pa->u.pa_tmp_list, &discard_list); in ext4_mb_discard_lg_preallocations()
4321 list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) { in ext4_mb_discard_lg_preallocations()
4324 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_mb_discard_lg_preallocations()
4333 list_del(&pa->pa_group_list); in ext4_mb_discard_lg_preallocations()
4334 ext4_mb_release_group_pa(&e4b, pa); in ext4_mb_discard_lg_preallocations()
4338 list_del(&pa->u.pa_tmp_list); in ext4_mb_discard_lg_preallocations()
4339 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_discard_lg_preallocations()
4357 struct ext4_prealloc_space *tmp_pa, *pa = ac->ac_pa; in ext4_mb_add_n_trim() local
4359 order = fls(pa->pa_free) - 1; in ext4_mb_add_n_trim()
4372 if (!added && pa->pa_free < tmp_pa->pa_free) { in ext4_mb_add_n_trim()
4374 list_add_tail_rcu(&pa->pa_inode_list, in ext4_mb_add_n_trim()
4386 list_add_tail_rcu(&pa->pa_inode_list, in ext4_mb_add_n_trim()
4405 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_mb_release_context() local
4406 if (pa) { in ext4_mb_release_context()
4407 if (pa->pa_type == MB_GROUP_PA) { in ext4_mb_release_context()
4409 spin_lock(&pa->pa_lock); in ext4_mb_release_context()
4410 pa->pa_pstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len); in ext4_mb_release_context()
4411 pa->pa_lstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len); in ext4_mb_release_context()
4412 pa->pa_free -= ac->ac_b_ex.fe_len; in ext4_mb_release_context()
4413 pa->pa_len -= ac->ac_b_ex.fe_len; in ext4_mb_release_context()
4414 spin_unlock(&pa->pa_lock); in ext4_mb_release_context()
4417 if (pa) { in ext4_mb_release_context()
4424 if ((pa->pa_type == MB_GROUP_PA) && likely(pa->pa_free)) { in ext4_mb_release_context()
4425 spin_lock(pa->pa_obj_lock); in ext4_mb_release_context()
4426 list_del_rcu(&pa->pa_inode_list); in ext4_mb_release_context()
4427 spin_unlock(pa->pa_obj_lock); in ext4_mb_release_context()
4430 ext4_mb_put_pa(ac, ac->ac_sb, pa); in ext4_mb_release_context()