Lines Matching refs:pa
765 struct ext4_prealloc_space *pa; in __mb_check_buddy() local
766 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in __mb_check_buddy()
767 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &groupnr, &k); in __mb_check_buddy()
769 for (i = 0; i < pa->pa_len; i++) in __mb_check_buddy()
3716 struct ext4_prealloc_space *pa; in ext4_mb_cleanup_pa() local
3721 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in ext4_mb_cleanup_pa()
3722 list_del(&pa->pa_group_list); in ext4_mb_cleanup_pa()
3724 kmem_cache_free(ext4_pspace_cachep, pa); in ext4_mb_cleanup_pa()
4612 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_discard_allocated_blocks() local
4616 if (pa == NULL) { in ext4_discard_allocated_blocks()
4635 if (pa->pa_type == MB_INODE_PA) { in ext4_discard_allocated_blocks()
4636 spin_lock(&pa->pa_lock); in ext4_discard_allocated_blocks()
4637 pa->pa_free += ac->ac_b_ex.fe_len; in ext4_discard_allocated_blocks()
4638 spin_unlock(&pa->pa_lock); in ext4_discard_allocated_blocks()
4646 struct ext4_prealloc_space *pa) in ext4_mb_use_inode_pa() argument
4654 start = pa->pa_pstart + (ac->ac_o_ex.fe_logical - pa->pa_lstart); in ext4_mb_use_inode_pa()
4655 end = min(pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len), in ext4_mb_use_inode_pa()
4662 ac->ac_pa = pa; in ext4_mb_use_inode_pa()
4664 BUG_ON(start < pa->pa_pstart); in ext4_mb_use_inode_pa()
4665 BUG_ON(end > pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len)); in ext4_mb_use_inode_pa()
4666 BUG_ON(pa->pa_free < len); in ext4_mb_use_inode_pa()
4668 pa->pa_free -= len; in ext4_mb_use_inode_pa()
4670 mb_debug(ac->ac_sb, "use %llu/%d from inode pa %p\n", start, len, pa); in ext4_mb_use_inode_pa()
4677 struct ext4_prealloc_space *pa) in ext4_mb_use_group_pa() argument
4681 ext4_get_group_no_and_offset(ac->ac_sb, pa->pa_pstart, in ext4_mb_use_group_pa()
4686 ac->ac_pa = pa; in ext4_mb_use_group_pa()
4695 pa->pa_lstart, len, pa); in ext4_mb_use_group_pa()
4706 struct ext4_prealloc_space *pa, in ext4_mb_check_group_pa() argument
4712 atomic_inc(&pa->pa_count); in ext4_mb_check_group_pa()
4713 return pa; in ext4_mb_check_group_pa()
4716 new_distance = abs(goal_block - pa->pa_pstart); in ext4_mb_check_group_pa()
4723 atomic_inc(&pa->pa_count); in ext4_mb_check_group_pa()
4724 return pa; in ext4_mb_check_group_pa()
4732 struct ext4_prealloc_space *pa) in ext4_mb_pa_goal_check() argument
4746 start = pa->pa_pstart + in ext4_mb_pa_goal_check()
4747 (ac->ac_g_ex.fe_logical - pa->pa_lstart); in ext4_mb_pa_goal_check()
4751 if (ac->ac_g_ex.fe_len > pa->pa_len - in ext4_mb_pa_goal_check()
4752 EXT4_B2C(sbi, ac->ac_g_ex.fe_logical - pa->pa_lstart)) in ext4_mb_pa_goal_check()
4996 struct ext4_prealloc_space *pa; in ext4_mb_generate_from_pa() local
5015 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in ext4_mb_generate_from_pa()
5016 spin_lock(&pa->pa_lock); in ext4_mb_generate_from_pa()
5017 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_generate_from_pa()
5019 len = pa->pa_len; in ext4_mb_generate_from_pa()
5020 spin_unlock(&pa->pa_lock); in ext4_mb_generate_from_pa()
5031 struct ext4_prealloc_space *pa) in ext4_mb_mark_pa_deleted() argument
5035 if (pa->pa_deleted) { in ext4_mb_mark_pa_deleted()
5037 pa->pa_type, pa->pa_pstart, pa->pa_lstart, in ext4_mb_mark_pa_deleted()
5038 pa->pa_len); in ext4_mb_mark_pa_deleted()
5042 pa->pa_deleted = 1; in ext4_mb_mark_pa_deleted()
5044 if (pa->pa_type == MB_INODE_PA) { in ext4_mb_mark_pa_deleted()
5045 ei = EXT4_I(pa->pa_inode); in ext4_mb_mark_pa_deleted()
5050 static inline void ext4_mb_pa_free(struct ext4_prealloc_space *pa) in ext4_mb_pa_free() argument
5052 BUG_ON(!pa); in ext4_mb_pa_free()
5053 BUG_ON(atomic_read(&pa->pa_count)); in ext4_mb_pa_free()
5054 BUG_ON(pa->pa_deleted == 0); in ext4_mb_pa_free()
5055 kmem_cache_free(ext4_pspace_cachep, pa); in ext4_mb_pa_free()
5060 struct ext4_prealloc_space *pa; in ext4_mb_pa_callback() local
5062 pa = container_of(head, struct ext4_prealloc_space, u.pa_rcu); in ext4_mb_pa_callback()
5063 ext4_mb_pa_free(pa); in ext4_mb_pa_callback()
5071 struct super_block *sb, struct ext4_prealloc_space *pa) in ext4_mb_put_pa() argument
5078 spin_lock(&pa->pa_lock); in ext4_mb_put_pa()
5079 if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0) { in ext4_mb_put_pa()
5080 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
5084 if (pa->pa_deleted == 1) { in ext4_mb_put_pa()
5085 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
5089 ext4_mb_mark_pa_deleted(sb, pa); in ext4_mb_put_pa()
5090 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
5092 grp_blk = pa->pa_pstart; in ext4_mb_put_pa()
5097 if (pa->pa_type == MB_GROUP_PA) in ext4_mb_put_pa()
5117 list_del(&pa->pa_group_list); in ext4_mb_put_pa()
5120 if (pa->pa_type == MB_INODE_PA) { in ext4_mb_put_pa()
5121 write_lock(pa->pa_node_lock.inode_lock); in ext4_mb_put_pa()
5122 rb_erase(&pa->pa_node.inode_node, &ei->i_prealloc_node); in ext4_mb_put_pa()
5123 write_unlock(pa->pa_node_lock.inode_lock); in ext4_mb_put_pa()
5124 ext4_mb_pa_free(pa); in ext4_mb_put_pa()
5126 spin_lock(pa->pa_node_lock.lg_lock); in ext4_mb_put_pa()
5127 list_del_rcu(&pa->pa_node.lg_list); in ext4_mb_put_pa()
5128 spin_unlock(pa->pa_node_lock.lg_lock); in ext4_mb_put_pa()
5129 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_put_pa()
5166 struct ext4_prealloc_space *pa; in ext4_mb_new_inode_pa() local
5176 pa = ac->ac_pa; in ext4_mb_new_inode_pa()
5221 pa->pa_lstart = ac->ac_b_ex.fe_logical; in ext4_mb_new_inode_pa()
5222 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_inode_pa()
5223 pa->pa_len = ac->ac_b_ex.fe_len; in ext4_mb_new_inode_pa()
5224 pa->pa_free = pa->pa_len; in ext4_mb_new_inode_pa()
5225 spin_lock_init(&pa->pa_lock); in ext4_mb_new_inode_pa()
5226 INIT_LIST_HEAD(&pa->pa_group_list); in ext4_mb_new_inode_pa()
5227 pa->pa_deleted = 0; in ext4_mb_new_inode_pa()
5228 pa->pa_type = MB_INODE_PA; in ext4_mb_new_inode_pa()
5230 mb_debug(sb, "new inode pa %p: %llu/%d for %u\n", pa, pa->pa_pstart, in ext4_mb_new_inode_pa()
5231 pa->pa_len, pa->pa_lstart); in ext4_mb_new_inode_pa()
5232 trace_ext4_mb_new_inode_pa(ac, pa); in ext4_mb_new_inode_pa()
5234 atomic_add(pa->pa_free, &sbi->s_mb_preallocated); in ext4_mb_new_inode_pa()
5235 ext4_mb_use_inode_pa(ac, pa); in ext4_mb_new_inode_pa()
5242 pa->pa_node_lock.inode_lock = &ei->i_prealloc_lock; in ext4_mb_new_inode_pa()
5243 pa->pa_inode = ac->ac_inode; in ext4_mb_new_inode_pa()
5245 list_add(&pa->pa_group_list, &grp->bb_prealloc_list); in ext4_mb_new_inode_pa()
5247 write_lock(pa->pa_node_lock.inode_lock); in ext4_mb_new_inode_pa()
5248 ext4_mb_pa_rb_insert(&ei->i_prealloc_node, &pa->pa_node.inode_node); in ext4_mb_new_inode_pa()
5249 write_unlock(pa->pa_node_lock.inode_lock); in ext4_mb_new_inode_pa()
5261 struct ext4_prealloc_space *pa; in ext4_mb_new_group_pa() local
5270 pa = ac->ac_pa; in ext4_mb_new_group_pa()
5272 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_group_pa()
5273 pa->pa_lstart = pa->pa_pstart; in ext4_mb_new_group_pa()
5274 pa->pa_len = ac->ac_b_ex.fe_len; in ext4_mb_new_group_pa()
5275 pa->pa_free = pa->pa_len; in ext4_mb_new_group_pa()
5276 spin_lock_init(&pa->pa_lock); in ext4_mb_new_group_pa()
5277 INIT_LIST_HEAD(&pa->pa_node.lg_list); in ext4_mb_new_group_pa()
5278 INIT_LIST_HEAD(&pa->pa_group_list); in ext4_mb_new_group_pa()
5279 pa->pa_deleted = 0; in ext4_mb_new_group_pa()
5280 pa->pa_type = MB_GROUP_PA; in ext4_mb_new_group_pa()
5282 mb_debug(sb, "new group pa %p: %llu/%d for %u\n", pa, pa->pa_pstart, in ext4_mb_new_group_pa()
5283 pa->pa_len, pa->pa_lstart); in ext4_mb_new_group_pa()
5284 trace_ext4_mb_new_group_pa(ac, pa); in ext4_mb_new_group_pa()
5286 ext4_mb_use_group_pa(ac, pa); in ext4_mb_new_group_pa()
5287 atomic_add(pa->pa_free, &EXT4_SB(sb)->s_mb_preallocated); in ext4_mb_new_group_pa()
5295 pa->pa_node_lock.lg_lock = &lg->lg_prealloc_lock; in ext4_mb_new_group_pa()
5296 pa->pa_inode = NULL; in ext4_mb_new_group_pa()
5298 list_add(&pa->pa_group_list, &grp->bb_prealloc_list); in ext4_mb_new_group_pa()
5324 struct ext4_prealloc_space *pa) in ext4_mb_release_inode_pa() argument
5335 BUG_ON(pa->pa_deleted == 0); in ext4_mb_release_inode_pa()
5336 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); in ext4_mb_release_inode_pa()
5337 grp_blk_start = pa->pa_pstart - EXT4_C2B(sbi, bit); in ext4_mb_release_inode_pa()
5338 BUG_ON(group != e4b->bd_group && pa->pa_len != 0); in ext4_mb_release_inode_pa()
5339 end = bit + pa->pa_len; in ext4_mb_release_inode_pa()
5352 trace_ext4_mb_release_inode_pa(pa, (grp_blk_start + in ext4_mb_release_inode_pa()
5355 mb_free_blocks(pa->pa_inode, e4b, bit, next - bit); in ext4_mb_release_inode_pa()
5358 if (free != pa->pa_free) { in ext4_mb_release_inode_pa()
5361 pa, (unsigned long) pa->pa_lstart, in ext4_mb_release_inode_pa()
5362 (unsigned long) pa->pa_pstart, in ext4_mb_release_inode_pa()
5363 pa->pa_len); in ext4_mb_release_inode_pa()
5365 free, pa->pa_free); in ext4_mb_release_inode_pa()
5378 struct ext4_prealloc_space *pa) in ext4_mb_release_group_pa() argument
5384 trace_ext4_mb_release_group_pa(sb, pa); in ext4_mb_release_group_pa()
5385 BUG_ON(pa->pa_deleted == 0); in ext4_mb_release_group_pa()
5386 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); in ext4_mb_release_group_pa()
5387 if (unlikely(group != e4b->bd_group && pa->pa_len != 0)) { in ext4_mb_release_group_pa()
5389 e4b->bd_group, group, pa->pa_pstart); in ext4_mb_release_group_pa()
5392 mb_free_blocks(pa->pa_inode, e4b, bit, pa->pa_len); in ext4_mb_release_group_pa()
5393 atomic_add(pa->pa_len, &EXT4_SB(sb)->s_mb_discarded); in ext4_mb_release_group_pa()
5394 trace_ext4_mballoc_discard(sb, NULL, group, bit, pa->pa_len); in ext4_mb_release_group_pa()
5414 struct ext4_prealloc_space *pa, *tmp; in ext4_mb_discard_group_preallocations() local
5445 list_for_each_entry_safe(pa, tmp, in ext4_mb_discard_group_preallocations()
5447 spin_lock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
5448 if (atomic_read(&pa->pa_count)) { in ext4_mb_discard_group_preallocations()
5449 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
5453 if (pa->pa_deleted) { in ext4_mb_discard_group_preallocations()
5454 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
5459 ext4_mb_mark_pa_deleted(sb, pa); in ext4_mb_discard_group_preallocations()
5465 free += pa->pa_free; in ext4_mb_discard_group_preallocations()
5467 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
5469 list_del(&pa->pa_group_list); in ext4_mb_discard_group_preallocations()
5470 list_add(&pa->u.pa_tmp_list, &list); in ext4_mb_discard_group_preallocations()
5474 list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) { in ext4_mb_discard_group_preallocations()
5477 if (pa->pa_type == MB_GROUP_PA) { in ext4_mb_discard_group_preallocations()
5478 spin_lock(pa->pa_node_lock.lg_lock); in ext4_mb_discard_group_preallocations()
5479 list_del_rcu(&pa->pa_node.lg_list); in ext4_mb_discard_group_preallocations()
5480 spin_unlock(pa->pa_node_lock.lg_lock); in ext4_mb_discard_group_preallocations()
5482 write_lock(pa->pa_node_lock.inode_lock); in ext4_mb_discard_group_preallocations()
5483 ei = EXT4_I(pa->pa_inode); in ext4_mb_discard_group_preallocations()
5484 rb_erase(&pa->pa_node.inode_node, &ei->i_prealloc_node); in ext4_mb_discard_group_preallocations()
5485 write_unlock(pa->pa_node_lock.inode_lock); in ext4_mb_discard_group_preallocations()
5488 list_del(&pa->u.pa_tmp_list); in ext4_mb_discard_group_preallocations()
5490 if (pa->pa_type == MB_GROUP_PA) { in ext4_mb_discard_group_preallocations()
5491 ext4_mb_release_group_pa(&e4b, pa); in ext4_mb_discard_group_preallocations()
5492 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_discard_group_preallocations()
5494 ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa); in ext4_mb_discard_group_preallocations()
5495 ext4_mb_pa_free(pa); in ext4_mb_discard_group_preallocations()
5522 struct ext4_prealloc_space *pa, *tmp; in ext4_discard_preallocations() local
5549 pa = rb_entry(iter, struct ext4_prealloc_space, in ext4_discard_preallocations()
5551 BUG_ON(pa->pa_node_lock.inode_lock != &ei->i_prealloc_lock); in ext4_discard_preallocations()
5553 spin_lock(&pa->pa_lock); in ext4_discard_preallocations()
5554 if (atomic_read(&pa->pa_count)) { in ext4_discard_preallocations()
5557 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
5566 if (pa->pa_deleted == 0) { in ext4_discard_preallocations()
5567 ext4_mb_mark_pa_deleted(sb, pa); in ext4_discard_preallocations()
5568 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
5569 rb_erase(&pa->pa_node.inode_node, &ei->i_prealloc_node); in ext4_discard_preallocations()
5570 list_add(&pa->u.pa_tmp_list, &list); in ext4_discard_preallocations()
5576 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
5596 list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) { in ext4_discard_preallocations()
5597 BUG_ON(pa->pa_type != MB_INODE_PA); in ext4_discard_preallocations()
5598 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_discard_preallocations()
5618 list_del(&pa->pa_group_list); in ext4_discard_preallocations()
5619 ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa); in ext4_discard_preallocations()
5625 list_del(&pa->u.pa_tmp_list); in ext4_discard_preallocations()
5626 ext4_mb_pa_free(pa); in ext4_discard_preallocations()
5632 struct ext4_prealloc_space *pa; in ext4_mb_pa_alloc() local
5635 pa = kmem_cache_zalloc(ext4_pspace_cachep, GFP_NOFS); in ext4_mb_pa_alloc()
5636 if (!pa) in ext4_mb_pa_alloc()
5638 atomic_set(&pa->pa_count, 1); in ext4_mb_pa_alloc()
5639 ac->ac_pa = pa; in ext4_mb_pa_alloc()
5645 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_mb_pa_put_free() local
5647 BUG_ON(!pa); in ext4_mb_pa_put_free()
5649 WARN_ON(!atomic_dec_and_test(&pa->pa_count)); in ext4_mb_pa_put_free()
5655 pa->pa_deleted = 1; in ext4_mb_pa_put_free()
5656 ext4_mb_pa_free(pa); in ext4_mb_pa_put_free()
5671 struct ext4_prealloc_space *pa; in ext4_mb_show_pa() local
5679 pa = list_entry(cur, struct ext4_prealloc_space, in ext4_mb_show_pa()
5681 spin_lock(&pa->pa_lock); in ext4_mb_show_pa()
5682 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_show_pa()
5684 spin_unlock(&pa->pa_lock); in ext4_mb_show_pa()
5686 pa->pa_len); in ext4_mb_show_pa()
5857 struct ext4_prealloc_space *pa, *tmp; in ext4_mb_discard_lg_preallocations() local
5862 list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[order], in ext4_mb_discard_lg_preallocations()
5865 spin_lock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
5866 if (atomic_read(&pa->pa_count)) { in ext4_mb_discard_lg_preallocations()
5872 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
5875 if (pa->pa_deleted) { in ext4_mb_discard_lg_preallocations()
5876 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
5880 BUG_ON(pa->pa_type != MB_GROUP_PA); in ext4_mb_discard_lg_preallocations()
5883 ext4_mb_mark_pa_deleted(sb, pa); in ext4_mb_discard_lg_preallocations()
5884 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
5886 list_del_rcu(&pa->pa_node.lg_list); in ext4_mb_discard_lg_preallocations()
5887 list_add(&pa->u.pa_tmp_list, &discard_list); in ext4_mb_discard_lg_preallocations()
5902 list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) { in ext4_mb_discard_lg_preallocations()
5905 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_mb_discard_lg_preallocations()
5914 list_del(&pa->pa_group_list); in ext4_mb_discard_lg_preallocations()
5915 ext4_mb_release_group_pa(&e4b, pa); in ext4_mb_discard_lg_preallocations()
5919 list_del(&pa->u.pa_tmp_list); in ext4_mb_discard_lg_preallocations()
5920 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_discard_lg_preallocations()
5938 struct ext4_prealloc_space *tmp_pa, *pa = ac->ac_pa; in ext4_mb_add_n_trim() local
5940 order = fls(pa->pa_free) - 1; in ext4_mb_add_n_trim()
5954 if (!added && pa->pa_free < tmp_pa->pa_free) { in ext4_mb_add_n_trim()
5956 list_add_tail_rcu(&pa->pa_node.lg_list, in ext4_mb_add_n_trim()
5968 list_add_tail_rcu(&pa->pa_node.lg_list, in ext4_mb_add_n_trim()
5984 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_mb_release_context() local
5985 if (pa) { in ext4_mb_release_context()
5986 if (pa->pa_type == MB_GROUP_PA) { in ext4_mb_release_context()
5988 spin_lock(&pa->pa_lock); in ext4_mb_release_context()
5989 pa->pa_pstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len); in ext4_mb_release_context()
5990 pa->pa_lstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len); in ext4_mb_release_context()
5991 pa->pa_free -= ac->ac_b_ex.fe_len; in ext4_mb_release_context()
5992 pa->pa_len -= ac->ac_b_ex.fe_len; in ext4_mb_release_context()
5993 spin_unlock(&pa->pa_lock); in ext4_mb_release_context()
6001 if (likely(pa->pa_free)) { in ext4_mb_release_context()
6002 spin_lock(pa->pa_node_lock.lg_lock); in ext4_mb_release_context()
6003 list_del_rcu(&pa->pa_node.lg_list); in ext4_mb_release_context()
6004 spin_unlock(pa->pa_node_lock.lg_lock); in ext4_mb_release_context()
6009 ext4_mb_put_pa(ac, ac->ac_sb, pa); in ext4_mb_release_context()