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()
2682 struct ext4_prealloc_space *pa; in ext4_mb_cleanup_pa() local
2687 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in ext4_mb_cleanup_pa()
2688 list_del(&pa->pa_group_list); in ext4_mb_cleanup_pa()
2690 kmem_cache_free(ext4_pspace_cachep, pa); in ext4_mb_cleanup_pa()
3069 struct ext4_prealloc_space *pa; in ext4_mb_normalize_request() local
3163 list_for_each_entry_rcu(pa, &ei->i_prealloc_list, pa_inode_list) { in ext4_mb_normalize_request()
3166 if (pa->pa_deleted) in ext4_mb_normalize_request()
3168 spin_lock(&pa->pa_lock); in ext4_mb_normalize_request()
3169 if (pa->pa_deleted) { in ext4_mb_normalize_request()
3170 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3174 pa_end = pa->pa_lstart + EXT4_C2B(EXT4_SB(ac->ac_sb), in ext4_mb_normalize_request()
3175 pa->pa_len); in ext4_mb_normalize_request()
3179 ac->ac_o_ex.fe_logical < pa->pa_lstart)); in ext4_mb_normalize_request()
3182 if (pa->pa_lstart >= end || pa_end <= start) { in ext4_mb_normalize_request()
3183 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3186 BUG_ON(pa->pa_lstart <= start && pa_end >= end); in ext4_mb_normalize_request()
3192 } else if (pa->pa_lstart > ac->ac_o_ex.fe_logical) { in ext4_mb_normalize_request()
3193 BUG_ON(pa->pa_lstart > end); in ext4_mb_normalize_request()
3194 end = pa->pa_lstart; in ext4_mb_normalize_request()
3196 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3203 list_for_each_entry_rcu(pa, &ei->i_prealloc_list, pa_inode_list) { in ext4_mb_normalize_request()
3206 spin_lock(&pa->pa_lock); in ext4_mb_normalize_request()
3207 if (pa->pa_deleted == 0) { in ext4_mb_normalize_request()
3208 pa_end = pa->pa_lstart + EXT4_C2B(EXT4_SB(ac->ac_sb), in ext4_mb_normalize_request()
3209 pa->pa_len); in ext4_mb_normalize_request()
3210 BUG_ON(!(start >= pa_end || end <= pa->pa_lstart)); in ext4_mb_normalize_request()
3212 spin_unlock(&pa->pa_lock); in ext4_mb_normalize_request()
3284 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_discard_allocated_blocks() local
3288 if (pa == NULL) { in ext4_discard_allocated_blocks()
3308 if (pa->pa_type == MB_INODE_PA) in ext4_discard_allocated_blocks()
3309 pa->pa_free += ac->ac_b_ex.fe_len; in ext4_discard_allocated_blocks()
3316 struct ext4_prealloc_space *pa) in ext4_mb_use_inode_pa() argument
3324 start = pa->pa_pstart + (ac->ac_o_ex.fe_logical - pa->pa_lstart); in ext4_mb_use_inode_pa()
3325 end = min(pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len), in ext4_mb_use_inode_pa()
3332 ac->ac_pa = pa; in ext4_mb_use_inode_pa()
3334 BUG_ON(start < pa->pa_pstart); in ext4_mb_use_inode_pa()
3335 BUG_ON(end > pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len)); in ext4_mb_use_inode_pa()
3336 BUG_ON(pa->pa_free < len); in ext4_mb_use_inode_pa()
3337 pa->pa_free -= len; in ext4_mb_use_inode_pa()
3339 mb_debug(1, "use %llu/%u from inode pa %p\n", start, len, pa); in ext4_mb_use_inode_pa()
3346 struct ext4_prealloc_space *pa) in ext4_mb_use_group_pa() argument
3350 ext4_get_group_no_and_offset(ac->ac_sb, pa->pa_pstart, in ext4_mb_use_group_pa()
3355 ac->ac_pa = pa; in ext4_mb_use_group_pa()
3363 mb_debug(1, "use %u/%u from group pa %p\n", pa->pa_lstart-len, len, pa); in ext4_mb_use_group_pa()
3374 struct ext4_prealloc_space *pa, in ext4_mb_check_group_pa() argument
3380 atomic_inc(&pa->pa_count); in ext4_mb_check_group_pa()
3381 return pa; in ext4_mb_check_group_pa()
3384 new_distance = abs(goal_block - pa->pa_pstart); in ext4_mb_check_group_pa()
3391 atomic_inc(&pa->pa_count); in ext4_mb_check_group_pa()
3392 return pa; in ext4_mb_check_group_pa()
3405 struct ext4_prealloc_space *pa, *cpa = NULL; in ext4_mb_use_preallocated() local
3414 list_for_each_entry_rcu(pa, &ei->i_prealloc_list, pa_inode_list) { in ext4_mb_use_preallocated()
3418 if (ac->ac_o_ex.fe_logical < pa->pa_lstart || in ext4_mb_use_preallocated()
3419 ac->ac_o_ex.fe_logical >= (pa->pa_lstart + in ext4_mb_use_preallocated()
3420 EXT4_C2B(sbi, pa->pa_len))) in ext4_mb_use_preallocated()
3425 (pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len) > in ext4_mb_use_preallocated()
3430 spin_lock(&pa->pa_lock); in ext4_mb_use_preallocated()
3431 if (pa->pa_deleted == 0 && pa->pa_free) { in ext4_mb_use_preallocated()
3432 atomic_inc(&pa->pa_count); in ext4_mb_use_preallocated()
3433 ext4_mb_use_inode_pa(ac, pa); in ext4_mb_use_preallocated()
3434 spin_unlock(&pa->pa_lock); in ext4_mb_use_preallocated()
3439 spin_unlock(&pa->pa_lock); in ext4_mb_use_preallocated()
3463 list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[i], in ext4_mb_use_preallocated()
3465 spin_lock(&pa->pa_lock); in ext4_mb_use_preallocated()
3466 if (pa->pa_deleted == 0 && in ext4_mb_use_preallocated()
3467 pa->pa_free >= ac->ac_o_ex.fe_len) { in ext4_mb_use_preallocated()
3470 pa, cpa); in ext4_mb_use_preallocated()
3472 spin_unlock(&pa->pa_lock); in ext4_mb_use_preallocated()
3518 struct ext4_prealloc_space *pa; in ext4_mb_generate_from_pa() local
3534 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in ext4_mb_generate_from_pa()
3535 spin_lock(&pa->pa_lock); in ext4_mb_generate_from_pa()
3536 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_generate_from_pa()
3538 len = pa->pa_len; in ext4_mb_generate_from_pa()
3539 spin_unlock(&pa->pa_lock); in ext4_mb_generate_from_pa()
3551 struct ext4_prealloc_space *pa; in ext4_mb_pa_callback() local
3552 pa = container_of(head, struct ext4_prealloc_space, u.pa_rcu); in ext4_mb_pa_callback()
3554 BUG_ON(atomic_read(&pa->pa_count)); in ext4_mb_pa_callback()
3555 BUG_ON(pa->pa_deleted == 0); in ext4_mb_pa_callback()
3556 kmem_cache_free(ext4_pspace_cachep, pa); in ext4_mb_pa_callback()
3564 struct super_block *sb, struct ext4_prealloc_space *pa) in ext4_mb_put_pa() argument
3570 spin_lock(&pa->pa_lock); in ext4_mb_put_pa()
3571 if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0) { in ext4_mb_put_pa()
3572 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
3576 if (pa->pa_deleted == 1) { in ext4_mb_put_pa()
3577 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
3581 pa->pa_deleted = 1; in ext4_mb_put_pa()
3582 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
3584 grp_blk = pa->pa_pstart; in ext4_mb_put_pa()
3589 if (pa->pa_type == MB_GROUP_PA) in ext4_mb_put_pa()
3609 list_del(&pa->pa_group_list); in ext4_mb_put_pa()
3612 spin_lock(pa->pa_obj_lock); in ext4_mb_put_pa()
3613 list_del_rcu(&pa->pa_inode_list); in ext4_mb_put_pa()
3614 spin_unlock(pa->pa_obj_lock); in ext4_mb_put_pa()
3616 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_put_pa()
3627 struct ext4_prealloc_space *pa; in ext4_mb_new_inode_pa() local
3636 pa = kmem_cache_alloc(ext4_pspace_cachep, GFP_NOFS); in ext4_mb_new_inode_pa()
3637 if (pa == NULL) in ext4_mb_new_inode_pa()
3678 pa->pa_lstart = ac->ac_b_ex.fe_logical; in ext4_mb_new_inode_pa()
3679 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_inode_pa()
3680 pa->pa_len = ac->ac_b_ex.fe_len; in ext4_mb_new_inode_pa()
3681 pa->pa_free = pa->pa_len; in ext4_mb_new_inode_pa()
3682 atomic_set(&pa->pa_count, 1); in ext4_mb_new_inode_pa()
3683 spin_lock_init(&pa->pa_lock); in ext4_mb_new_inode_pa()
3684 INIT_LIST_HEAD(&pa->pa_inode_list); in ext4_mb_new_inode_pa()
3685 INIT_LIST_HEAD(&pa->pa_group_list); in ext4_mb_new_inode_pa()
3686 pa->pa_deleted = 0; in ext4_mb_new_inode_pa()
3687 pa->pa_type = MB_INODE_PA; in ext4_mb_new_inode_pa()
3689 mb_debug(1, "new inode pa %p: %llu/%u for %u\n", pa, in ext4_mb_new_inode_pa()
3690 pa->pa_pstart, pa->pa_len, pa->pa_lstart); in ext4_mb_new_inode_pa()
3691 trace_ext4_mb_new_inode_pa(ac, pa); in ext4_mb_new_inode_pa()
3693 ext4_mb_use_inode_pa(ac, pa); in ext4_mb_new_inode_pa()
3694 atomic_add(pa->pa_free, &sbi->s_mb_preallocated); in ext4_mb_new_inode_pa()
3699 pa->pa_obj_lock = &ei->i_prealloc_lock; in ext4_mb_new_inode_pa()
3700 pa->pa_inode = ac->ac_inode; in ext4_mb_new_inode_pa()
3703 list_add(&pa->pa_group_list, &grp->bb_prealloc_list); in ext4_mb_new_inode_pa()
3706 spin_lock(pa->pa_obj_lock); in ext4_mb_new_inode_pa()
3707 list_add_rcu(&pa->pa_inode_list, &ei->i_prealloc_list); in ext4_mb_new_inode_pa()
3708 spin_unlock(pa->pa_obj_lock); in ext4_mb_new_inode_pa()
3721 struct ext4_prealloc_space *pa; in ext4_mb_new_group_pa() local
3730 pa = kmem_cache_alloc(ext4_pspace_cachep, GFP_NOFS); in ext4_mb_new_group_pa()
3731 if (pa == NULL) in ext4_mb_new_group_pa()
3738 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_group_pa()
3739 pa->pa_lstart = pa->pa_pstart; in ext4_mb_new_group_pa()
3740 pa->pa_len = ac->ac_b_ex.fe_len; in ext4_mb_new_group_pa()
3741 pa->pa_free = pa->pa_len; in ext4_mb_new_group_pa()
3742 atomic_set(&pa->pa_count, 1); in ext4_mb_new_group_pa()
3743 spin_lock_init(&pa->pa_lock); in ext4_mb_new_group_pa()
3744 INIT_LIST_HEAD(&pa->pa_inode_list); in ext4_mb_new_group_pa()
3745 INIT_LIST_HEAD(&pa->pa_group_list); in ext4_mb_new_group_pa()
3746 pa->pa_deleted = 0; in ext4_mb_new_group_pa()
3747 pa->pa_type = MB_GROUP_PA; in ext4_mb_new_group_pa()
3749 mb_debug(1, "new group pa %p: %llu/%u for %u\n", pa, in ext4_mb_new_group_pa()
3750 pa->pa_pstart, pa->pa_len, pa->pa_lstart); in ext4_mb_new_group_pa()
3751 trace_ext4_mb_new_group_pa(ac, pa); in ext4_mb_new_group_pa()
3753 ext4_mb_use_group_pa(ac, pa); in ext4_mb_new_group_pa()
3754 atomic_add(pa->pa_free, &EXT4_SB(sb)->s_mb_preallocated); in ext4_mb_new_group_pa()
3760 pa->pa_obj_lock = &lg->lg_prealloc_lock; in ext4_mb_new_group_pa()
3761 pa->pa_inode = NULL; in ext4_mb_new_group_pa()
3764 list_add(&pa->pa_group_list, &grp->bb_prealloc_list); in ext4_mb_new_group_pa()
3795 struct ext4_prealloc_space *pa) in ext4_mb_release_inode_pa() argument
3806 BUG_ON(pa->pa_deleted == 0); in ext4_mb_release_inode_pa()
3807 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); in ext4_mb_release_inode_pa()
3808 grp_blk_start = pa->pa_pstart - EXT4_C2B(sbi, bit); in ext4_mb_release_inode_pa()
3809 BUG_ON(group != e4b->bd_group && pa->pa_len != 0); in ext4_mb_release_inode_pa()
3810 end = bit + pa->pa_len; in ext4_mb_release_inode_pa()
3823 trace_ext4_mb_release_inode_pa(pa, (grp_blk_start + in ext4_mb_release_inode_pa()
3826 mb_free_blocks(pa->pa_inode, e4b, bit, next - bit); in ext4_mb_release_inode_pa()
3829 if (free != pa->pa_free) { in ext4_mb_release_inode_pa()
3832 pa, (unsigned long) pa->pa_lstart, in ext4_mb_release_inode_pa()
3833 (unsigned long) pa->pa_pstart, in ext4_mb_release_inode_pa()
3834 (unsigned long) pa->pa_len); in ext4_mb_release_inode_pa()
3836 free, pa->pa_free); in ext4_mb_release_inode_pa()
3849 struct ext4_prealloc_space *pa) in ext4_mb_release_group_pa() argument
3855 trace_ext4_mb_release_group_pa(sb, pa); in ext4_mb_release_group_pa()
3856 BUG_ON(pa->pa_deleted == 0); in ext4_mb_release_group_pa()
3857 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); in ext4_mb_release_group_pa()
3858 BUG_ON(group != e4b->bd_group && pa->pa_len != 0); in ext4_mb_release_group_pa()
3859 mb_free_blocks(pa->pa_inode, e4b, bit, pa->pa_len); in ext4_mb_release_group_pa()
3860 atomic_add(pa->pa_len, &EXT4_SB(sb)->s_mb_discarded); in ext4_mb_release_group_pa()
3861 trace_ext4_mballoc_discard(sb, NULL, group, bit, pa->pa_len); in ext4_mb_release_group_pa()
3881 struct ext4_prealloc_space *pa, *tmp; in ext4_mb_discard_group_preallocations() local
3915 list_for_each_entry_safe(pa, tmp, in ext4_mb_discard_group_preallocations()
3917 spin_lock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3918 if (atomic_read(&pa->pa_count)) { in ext4_mb_discard_group_preallocations()
3919 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3923 if (pa->pa_deleted) { in ext4_mb_discard_group_preallocations()
3924 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3929 pa->pa_deleted = 1; in ext4_mb_discard_group_preallocations()
3932 free += pa->pa_free; in ext4_mb_discard_group_preallocations()
3934 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
3936 list_del(&pa->pa_group_list); in ext4_mb_discard_group_preallocations()
3937 list_add(&pa->u.pa_tmp_list, &list); in ext4_mb_discard_group_preallocations()
3955 list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) { in ext4_mb_discard_group_preallocations()
3958 spin_lock(pa->pa_obj_lock); in ext4_mb_discard_group_preallocations()
3959 list_del_rcu(&pa->pa_inode_list); in ext4_mb_discard_group_preallocations()
3960 spin_unlock(pa->pa_obj_lock); in ext4_mb_discard_group_preallocations()
3962 if (pa->pa_type == MB_GROUP_PA) in ext4_mb_discard_group_preallocations()
3963 ext4_mb_release_group_pa(&e4b, pa); in ext4_mb_discard_group_preallocations()
3965 ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa); in ext4_mb_discard_group_preallocations()
3967 list_del(&pa->u.pa_tmp_list); in ext4_mb_discard_group_preallocations()
3968 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_discard_group_preallocations()
3992 struct ext4_prealloc_space *pa, *tmp; in ext4_discard_preallocations() local
4012 pa = list_entry(ei->i_prealloc_list.next, in ext4_discard_preallocations()
4014 BUG_ON(pa->pa_obj_lock != &ei->i_prealloc_lock); in ext4_discard_preallocations()
4015 spin_lock(&pa->pa_lock); in ext4_discard_preallocations()
4016 if (atomic_read(&pa->pa_count)) { in ext4_discard_preallocations()
4019 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
4028 if (pa->pa_deleted == 0) { in ext4_discard_preallocations()
4029 pa->pa_deleted = 1; in ext4_discard_preallocations()
4030 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
4031 list_del_rcu(&pa->pa_inode_list); in ext4_discard_preallocations()
4032 list_add(&pa->u.pa_tmp_list, &list); in ext4_discard_preallocations()
4037 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
4057 list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) { in ext4_discard_preallocations()
4058 BUG_ON(pa->pa_type != MB_INODE_PA); in ext4_discard_preallocations()
4059 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_discard_preallocations()
4079 list_del(&pa->pa_group_list); in ext4_discard_preallocations()
4080 ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa); in ext4_discard_preallocations()
4086 list_del(&pa->u.pa_tmp_list); in ext4_discard_preallocations()
4087 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_discard_preallocations()
4126 struct ext4_prealloc_space *pa; in ext4_mb_show_ac() local
4131 pa = list_entry(cur, struct ext4_prealloc_space, in ext4_mb_show_ac()
4133 spin_lock(&pa->pa_lock); in ext4_mb_show_ac()
4134 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_show_ac()
4136 spin_unlock(&pa->pa_lock); in ext4_mb_show_ac()
4138 start, pa->pa_len); in ext4_mb_show_ac()
4274 struct ext4_prealloc_space *pa, *tmp; in ext4_mb_discard_lg_preallocations() local
4281 list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[order], in ext4_mb_discard_lg_preallocations()
4283 spin_lock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4284 if (atomic_read(&pa->pa_count)) { in ext4_mb_discard_lg_preallocations()
4290 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4293 if (pa->pa_deleted) { in ext4_mb_discard_lg_preallocations()
4294 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4298 BUG_ON(pa->pa_type != MB_GROUP_PA); in ext4_mb_discard_lg_preallocations()
4301 pa->pa_deleted = 1; in ext4_mb_discard_lg_preallocations()
4302 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
4304 list_del_rcu(&pa->pa_inode_list); in ext4_mb_discard_lg_preallocations()
4305 list_add(&pa->u.pa_tmp_list, &discard_list); in ext4_mb_discard_lg_preallocations()
4320 list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) { in ext4_mb_discard_lg_preallocations()
4323 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_mb_discard_lg_preallocations()
4332 list_del(&pa->pa_group_list); in ext4_mb_discard_lg_preallocations()
4333 ext4_mb_release_group_pa(&e4b, pa); in ext4_mb_discard_lg_preallocations()
4337 list_del(&pa->u.pa_tmp_list); in ext4_mb_discard_lg_preallocations()
4338 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_discard_lg_preallocations()
4356 struct ext4_prealloc_space *tmp_pa, *pa = ac->ac_pa; in ext4_mb_add_n_trim() local
4358 order = fls(pa->pa_free) - 1; in ext4_mb_add_n_trim()
4371 if (!added && pa->pa_free < tmp_pa->pa_free) { in ext4_mb_add_n_trim()
4373 list_add_tail_rcu(&pa->pa_inode_list, in ext4_mb_add_n_trim()
4385 list_add_tail_rcu(&pa->pa_inode_list, in ext4_mb_add_n_trim()
4404 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_mb_release_context() local
4405 if (pa) { in ext4_mb_release_context()
4406 if (pa->pa_type == MB_GROUP_PA) { in ext4_mb_release_context()
4408 spin_lock(&pa->pa_lock); in ext4_mb_release_context()
4409 pa->pa_pstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len); in ext4_mb_release_context()
4410 pa->pa_lstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len); in ext4_mb_release_context()
4411 pa->pa_free -= ac->ac_b_ex.fe_len; in ext4_mb_release_context()
4412 pa->pa_len -= ac->ac_b_ex.fe_len; in ext4_mb_release_context()
4413 spin_unlock(&pa->pa_lock); in ext4_mb_release_context()
4416 if (pa) { in ext4_mb_release_context()
4423 if ((pa->pa_type == MB_GROUP_PA) && likely(pa->pa_free)) { in ext4_mb_release_context()
4424 spin_lock(pa->pa_obj_lock); in ext4_mb_release_context()
4425 list_del_rcu(&pa->pa_inode_list); in ext4_mb_release_context()
4426 spin_unlock(pa->pa_obj_lock); in ext4_mb_release_context()
4429 ext4_mb_put_pa(ac, ac->ac_sb, pa); in ext4_mb_release_context()