Lines Matching full:pa

263  *  blocks: how many blocks marked used/free in on-disk bitmap, buddy and PA.
267 * - new PA: buddy += N; PA = N
268 * - use inode PA: on-disk += N; PA -= N
269 * - discard inode PA buddy -= on-disk - PA; PA = 0
270 * - use locality group PA on-disk += N; PA -= N
271 * - discard locality group PA buddy -= PA; PA = 0
272 * note: 'buddy -= on-disk - PA' is used to show that on-disk bitmap
274 * bits from PA, only from on-disk bitmap
284 * bit set and PA claims same block, it's OK. IOW, one can set bit in
285 * on-disk bitmap if buddy has same bit set or/and PA covers corresponded
290 * - new PA
291 * blocks for PA are allocated in the buddy, buddy must be referenced
292 * until PA is linked to allocation group to avoid concurrent buddy init
293 * - use inode PA
294 * we need to make sure that either on-disk bitmap or PA has uptodate data
295 * given (3) we care that PA-=N operation doesn't interfere with init
296 * - discard inode PA
298 * - use locality group PA
299 * again PA-=N must be serialized with init
300 * - discard locality group PA
302 * - new PA vs.
303 * - use inode PA
305 * - discard inode PA
306 * discard process must wait until PA isn't used by another process
307 * - use locality group PA
309 * - discard locality group PA
310 * discard process must wait until PA isn't used by another process
311 * - use inode PA
312 * - use inode PA
314 * - discard inode PA
315 * discard process must wait until PA isn't used by another process
316 * - use locality group PA
318 * - discard locality group PA
319 * discard process must wait until PA isn't used by another process
322 * - PA is referenced and while it is no discard is possible
323 * - PA is referenced until block isn't marked in on-disk bitmap
324 * - PA changes only after on-disk bitmap
329 * a special case when we've used PA to emptiness. no need to modify buddy
344 * find proper PA (per-inode or group)
348 * release PA
360 * remove PA from object (inode or locality group)
372 * - per-pa lock (pa)
377 * - new pa
381 * - find and use pa:
382 * pa
384 * - release consumed pa:
385 * pa
391 * pa
395 * pa
400 * pa
769 struct ext4_prealloc_space *pa; in __mb_check_buddy() local
770 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in __mb_check_buddy()
771 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &groupnr, &k); in __mb_check_buddy()
773 for (i = 0; i < pa->pa_len; i++) in __mb_check_buddy()
3839 struct ext4_prealloc_space *pa; in ext4_mb_cleanup_pa() local
3844 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in ext4_mb_cleanup_pa()
3845 list_del(&pa->pa_group_list); in ext4_mb_cleanup_pa()
3847 kmem_cache_free(ext4_pspace_cachep, pa); in ext4_mb_cleanup_pa()
4303 * PA rbtree walk. We assume that we have held the inode PA rbtree lock
4377 /* Step 1: find any one immediate neighboring PA of the normalized range */ in ext4_mb_pa_adjust_overlap()
4386 /* PA must not overlap original request */ in ext4_mb_pa_adjust_overlap()
4395 * Step 2: check if the found PA is left or right neighbor and in ext4_mb_pa_adjust_overlap()
4623 * In case of inode pa, later we use the allocated blocks in ext4_mb_normalize_request()
4704 * Called on failure; free up any blocks from the inode PA for this
4711 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_discard_allocated_blocks() local
4715 if (pa == NULL) { in ext4_discard_allocated_blocks()
4734 if (pa->pa_type == MB_INODE_PA) { in ext4_discard_allocated_blocks()
4735 spin_lock(&pa->pa_lock); in ext4_discard_allocated_blocks()
4736 pa->pa_free += ac->ac_b_ex.fe_len; in ext4_discard_allocated_blocks()
4737 spin_unlock(&pa->pa_lock); in ext4_discard_allocated_blocks()
4745 struct ext4_prealloc_space *pa) in ext4_mb_use_inode_pa() argument
4753 start = pa->pa_pstart + (ac->ac_o_ex.fe_logical - pa->pa_lstart); in ext4_mb_use_inode_pa()
4754 end = min(pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len), in ext4_mb_use_inode_pa()
4761 ac->ac_pa = pa; in ext4_mb_use_inode_pa()
4763 BUG_ON(start < pa->pa_pstart); in ext4_mb_use_inode_pa()
4764 BUG_ON(end > pa->pa_pstart + EXT4_C2B(sbi, pa->pa_len)); in ext4_mb_use_inode_pa()
4765 BUG_ON(pa->pa_free < len); in ext4_mb_use_inode_pa()
4767 pa->pa_free -= len; in ext4_mb_use_inode_pa()
4769 mb_debug(ac->ac_sb, "use %llu/%d from inode pa %p\n", start, len, pa); in ext4_mb_use_inode_pa()
4776 struct ext4_prealloc_space *pa) in ext4_mb_use_group_pa() argument
4780 ext4_get_group_no_and_offset(ac->ac_sb, pa->pa_pstart, in ext4_mb_use_group_pa()
4785 ac->ac_pa = pa; in ext4_mb_use_group_pa()
4789 * instead we correct pa later, after blocks are marked in ext4_mb_use_group_pa()
4791 * Other CPUs are prevented from allocating from this pa by lg_mutex in ext4_mb_use_group_pa()
4793 mb_debug(ac->ac_sb, "use %u/%u from group pa %p\n", in ext4_mb_use_group_pa()
4794 pa->pa_lstart, len, pa); in ext4_mb_use_group_pa()
4805 struct ext4_prealloc_space *pa, in ext4_mb_check_group_pa() argument
4811 atomic_inc(&pa->pa_count); in ext4_mb_check_group_pa()
4812 return pa; in ext4_mb_check_group_pa()
4815 new_distance = abs(goal_block - pa->pa_pstart); in ext4_mb_check_group_pa()
4822 atomic_inc(&pa->pa_count); in ext4_mb_check_group_pa()
4823 return pa; in ext4_mb_check_group_pa()
4827 * check if found pa meets EXT4_MB_HINT_GOAL_ONLY
4831 struct ext4_prealloc_space *pa) in ext4_mb_pa_goal_check() argument
4845 start = pa->pa_pstart + in ext4_mb_pa_goal_check()
4846 (ac->ac_g_ex.fe_logical - pa->pa_lstart); in ext4_mb_pa_goal_check()
4850 if (ac->ac_g_ex.fe_len > pa->pa_len - in ext4_mb_pa_goal_check()
4851 EXT4_B2C(sbi, ac->ac_g_ex.fe_logical - pa->pa_lstart)) in ext4_mb_pa_goal_check()
4876 * first, try per-file preallocation by searching the inode pa rbtree. in ext4_mb_use_preallocated()
4879 * ext4_mb_discard_group_preallocation() can paralelly mark the pa in ext4_mb_use_preallocated()
4889 * Step 1: Find a pa with logical start immediately adjacent to the in ext4_mb_use_preallocated()
4902 * Step 2: The adjacent pa might be to the right of logical start, find in ext4_mb_use_preallocated()
4903 * the left adjacent pa. After this step we'd have a valid tmp_pa whose in ext4_mb_use_preallocated()
4915 * If there is no adjacent pa to the left then finding in ext4_mb_use_preallocated()
4916 * an overlapping pa is not possible hence stop searching in ext4_mb_use_preallocated()
4917 * inode pa tree in ext4_mb_use_preallocated()
4926 * Step 3: If the left adjacent pa is deleted, keep moving left to find in ext4_mb_use_preallocated()
4927 * the first non deleted adjacent pa. After this step we should have a in ext4_mb_use_preallocated()
4933 * no non deleted left adjacent pa, so stop searching in ext4_mb_use_preallocated()
4934 * inode pa tree in ext4_mb_use_preallocated()
4945 * to delete this pa underneath us. Since group in ext4_mb_use_preallocated()
4959 * Step 4: We now have the non deleted left adjacent pa. Only this in ext4_mb_use_preallocated()
4960 * pa can possibly satisfy the request hence check if it overlaps in ext4_mb_use_preallocated()
4973 * Since PAs don't overlap, we won't find any other PA to in ext4_mb_use_preallocated()
4988 * We found a valid overlapping pa but couldn't use it because in ext4_mb_use_preallocated()
4992 * 1. When a new inode pa is added to rbtree it must have in ext4_mb_use_preallocated()
4996 * 2. An inode pa that is in the rbtree can only have it's in ext4_mb_use_preallocated()
5011 * sure that another process will never see a pa in rbtree with in ext4_mb_use_preallocated()
5070 struct ext4_prealloc_space *pa; in ext4_mb_generate_from_pa() local
5089 pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); in ext4_mb_generate_from_pa()
5090 spin_lock(&pa->pa_lock); in ext4_mb_generate_from_pa()
5091 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_generate_from_pa()
5093 len = pa->pa_len; in ext4_mb_generate_from_pa()
5094 spin_unlock(&pa->pa_lock); in ext4_mb_generate_from_pa()
5105 struct ext4_prealloc_space *pa) in ext4_mb_mark_pa_deleted() argument
5109 if (pa->pa_deleted) { in ext4_mb_mark_pa_deleted()
5110 ext4_warning(sb, "deleted pa, type:%d, pblk:%llu, lblk:%u, len:%d\n", in ext4_mb_mark_pa_deleted()
5111 pa->pa_type, pa->pa_pstart, pa->pa_lstart, in ext4_mb_mark_pa_deleted()
5112 pa->pa_len); in ext4_mb_mark_pa_deleted()
5116 pa->pa_deleted = 1; in ext4_mb_mark_pa_deleted()
5118 if (pa->pa_type == MB_INODE_PA) { in ext4_mb_mark_pa_deleted()
5119 ei = EXT4_I(pa->pa_inode); in ext4_mb_mark_pa_deleted()
5124 static inline void ext4_mb_pa_free(struct ext4_prealloc_space *pa) in ext4_mb_pa_free() argument
5126 BUG_ON(!pa); in ext4_mb_pa_free()
5127 BUG_ON(atomic_read(&pa->pa_count)); in ext4_mb_pa_free()
5128 BUG_ON(pa->pa_deleted == 0); in ext4_mb_pa_free()
5129 kmem_cache_free(ext4_pspace_cachep, pa); in ext4_mb_pa_free()
5134 struct ext4_prealloc_space *pa; in ext4_mb_pa_callback() local
5136 pa = container_of(head, struct ext4_prealloc_space, u.pa_rcu); in ext4_mb_pa_callback()
5137 ext4_mb_pa_free(pa); in ext4_mb_pa_callback()
5145 struct super_block *sb, struct ext4_prealloc_space *pa) in ext4_mb_put_pa() argument
5152 spin_lock(&pa->pa_lock); in ext4_mb_put_pa()
5153 if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0) { in ext4_mb_put_pa()
5154 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
5158 if (pa->pa_deleted == 1) { in ext4_mb_put_pa()
5159 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
5163 ext4_mb_mark_pa_deleted(sb, pa); in ext4_mb_put_pa()
5164 spin_unlock(&pa->pa_lock); in ext4_mb_put_pa()
5166 grp_blk = pa->pa_pstart; in ext4_mb_put_pa()
5169 * next group when pa is used up in ext4_mb_put_pa()
5171 if (pa->pa_type == MB_GROUP_PA) in ext4_mb_put_pa()
5180 * find block B in PA in ext4_mb_put_pa()
5183 * drop PA from group in ext4_mb_put_pa()
5187 * we make "copy" and "mark all PAs" atomic and serialize "drop PA" in ext4_mb_put_pa()
5191 list_del(&pa->pa_group_list); in ext4_mb_put_pa()
5194 if (pa->pa_type == MB_INODE_PA) { in ext4_mb_put_pa()
5195 write_lock(pa->pa_node_lock.inode_lock); in ext4_mb_put_pa()
5196 rb_erase(&pa->pa_node.inode_node, &ei->i_prealloc_node); in ext4_mb_put_pa()
5197 write_unlock(pa->pa_node_lock.inode_lock); in ext4_mb_put_pa()
5198 ext4_mb_pa_free(pa); in ext4_mb_put_pa()
5200 spin_lock(pa->pa_node_lock.lg_lock); in ext4_mb_put_pa()
5201 list_del_rcu(&pa->pa_node.lg_list); in ext4_mb_put_pa()
5202 spin_unlock(pa->pa_node_lock.lg_lock); in ext4_mb_put_pa()
5203 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_put_pa()
5240 struct ext4_prealloc_space *pa; in ext4_mb_new_inode_pa() local
5250 pa = ac->ac_pa; in ext4_mb_new_inode_pa()
5300 pa->pa_lstart = ac->ac_b_ex.fe_logical; in ext4_mb_new_inode_pa()
5301 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_inode_pa()
5302 pa->pa_len = ac->ac_b_ex.fe_len; in ext4_mb_new_inode_pa()
5303 pa->pa_free = pa->pa_len; in ext4_mb_new_inode_pa()
5304 spin_lock_init(&pa->pa_lock); in ext4_mb_new_inode_pa()
5305 INIT_LIST_HEAD(&pa->pa_group_list); in ext4_mb_new_inode_pa()
5306 pa->pa_deleted = 0; in ext4_mb_new_inode_pa()
5307 pa->pa_type = MB_INODE_PA; in ext4_mb_new_inode_pa()
5309 mb_debug(sb, "new inode pa %p: %llu/%d for %u\n", pa, pa->pa_pstart, in ext4_mb_new_inode_pa()
5310 pa->pa_len, pa->pa_lstart); in ext4_mb_new_inode_pa()
5311 trace_ext4_mb_new_inode_pa(ac, pa); in ext4_mb_new_inode_pa()
5313 atomic_add(pa->pa_free, &sbi->s_mb_preallocated); in ext4_mb_new_inode_pa()
5314 ext4_mb_use_inode_pa(ac, pa); in ext4_mb_new_inode_pa()
5321 pa->pa_node_lock.inode_lock = &ei->i_prealloc_lock; in ext4_mb_new_inode_pa()
5322 pa->pa_inode = ac->ac_inode; in ext4_mb_new_inode_pa()
5324 list_add(&pa->pa_group_list, &grp->bb_prealloc_list); in ext4_mb_new_inode_pa()
5326 write_lock(pa->pa_node_lock.inode_lock); in ext4_mb_new_inode_pa()
5327 ext4_mb_pa_rb_insert(&ei->i_prealloc_node, &pa->pa_node.inode_node); in ext4_mb_new_inode_pa()
5328 write_unlock(pa->pa_node_lock.inode_lock); in ext4_mb_new_inode_pa()
5340 struct ext4_prealloc_space *pa; in ext4_mb_new_group_pa() local
5349 pa = ac->ac_pa; in ext4_mb_new_group_pa()
5351 pa->pa_pstart = ext4_grp_offs_to_block(sb, &ac->ac_b_ex); in ext4_mb_new_group_pa()
5352 pa->pa_lstart = pa->pa_pstart; in ext4_mb_new_group_pa()
5353 pa->pa_len = ac->ac_b_ex.fe_len; in ext4_mb_new_group_pa()
5354 pa->pa_free = pa->pa_len; in ext4_mb_new_group_pa()
5355 spin_lock_init(&pa->pa_lock); in ext4_mb_new_group_pa()
5356 INIT_LIST_HEAD(&pa->pa_node.lg_list); in ext4_mb_new_group_pa()
5357 INIT_LIST_HEAD(&pa->pa_group_list); in ext4_mb_new_group_pa()
5358 pa->pa_deleted = 0; in ext4_mb_new_group_pa()
5359 pa->pa_type = MB_GROUP_PA; in ext4_mb_new_group_pa()
5361 mb_debug(sb, "new group pa %p: %llu/%d for %u\n", pa, pa->pa_pstart, in ext4_mb_new_group_pa()
5362 pa->pa_len, pa->pa_lstart); in ext4_mb_new_group_pa()
5363 trace_ext4_mb_new_group_pa(ac, pa); in ext4_mb_new_group_pa()
5365 ext4_mb_use_group_pa(ac, pa); in ext4_mb_new_group_pa()
5366 atomic_add(pa->pa_free, &EXT4_SB(sb)->s_mb_preallocated); in ext4_mb_new_group_pa()
5374 pa->pa_node_lock.lg_lock = &lg->lg_prealloc_lock; in ext4_mb_new_group_pa()
5375 pa->pa_inode = NULL; in ext4_mb_new_group_pa()
5377 list_add(&pa->pa_group_list, &grp->bb_prealloc_list); in ext4_mb_new_group_pa()
5380 * We will later add the new pa to the right bucket in ext4_mb_new_group_pa()
5396 * @pa must be unlinked from inode and group lists, so that
5403 struct ext4_prealloc_space *pa) in ext4_mb_release_inode_pa() argument
5414 BUG_ON(pa->pa_deleted == 0); in ext4_mb_release_inode_pa()
5415 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); in ext4_mb_release_inode_pa()
5416 grp_blk_start = pa->pa_pstart - EXT4_C2B(sbi, bit); in ext4_mb_release_inode_pa()
5417 BUG_ON(group != e4b->bd_group && pa->pa_len != 0); in ext4_mb_release_inode_pa()
5418 end = bit + pa->pa_len; in ext4_mb_release_inode_pa()
5431 trace_ext4_mb_release_inode_pa(pa, (grp_blk_start + in ext4_mb_release_inode_pa()
5434 mb_free_blocks(pa->pa_inode, e4b, bit, next - bit); in ext4_mb_release_inode_pa()
5437 if (free != pa->pa_free) { in ext4_mb_release_inode_pa()
5439 "pa %p: logic %lu, phys. %lu, len %d", in ext4_mb_release_inode_pa()
5440 pa, (unsigned long) pa->pa_lstart, in ext4_mb_release_inode_pa()
5441 (unsigned long) pa->pa_pstart, in ext4_mb_release_inode_pa()
5442 pa->pa_len); in ext4_mb_release_inode_pa()
5444 free, pa->pa_free); in ext4_mb_release_inode_pa()
5446 * pa is already deleted so we use the value obtained in ext4_mb_release_inode_pa()
5455 struct ext4_prealloc_space *pa) in ext4_mb_release_group_pa() argument
5461 trace_ext4_mb_release_group_pa(sb, pa); in ext4_mb_release_group_pa()
5462 BUG_ON(pa->pa_deleted == 0); in ext4_mb_release_group_pa()
5463 ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); in ext4_mb_release_group_pa()
5464 if (unlikely(group != e4b->bd_group && pa->pa_len != 0)) { in ext4_mb_release_group_pa()
5466 e4b->bd_group, group, pa->pa_pstart); in ext4_mb_release_group_pa()
5469 mb_free_blocks(pa->pa_inode, e4b, bit, pa->pa_len); in ext4_mb_release_group_pa()
5470 atomic_add(pa->pa_len, &EXT4_SB(sb)->s_mb_discarded); in ext4_mb_release_group_pa()
5471 trace_ext4_mballoc_discard(sb, NULL, group, bit, pa->pa_len); in ext4_mb_release_group_pa()
5489 struct ext4_prealloc_space *pa, *tmp; in ext4_mb_discard_group_preallocations() local
5520 list_for_each_entry_safe(pa, tmp, in ext4_mb_discard_group_preallocations()
5522 spin_lock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
5523 if (atomic_read(&pa->pa_count)) { in ext4_mb_discard_group_preallocations()
5524 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
5528 if (pa->pa_deleted) { in ext4_mb_discard_group_preallocations()
5529 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
5534 ext4_mb_mark_pa_deleted(sb, pa); in ext4_mb_discard_group_preallocations()
5540 free += pa->pa_free; in ext4_mb_discard_group_preallocations()
5542 spin_unlock(&pa->pa_lock); in ext4_mb_discard_group_preallocations()
5544 list_del(&pa->pa_group_list); in ext4_mb_discard_group_preallocations()
5545 list_add(&pa->u.pa_tmp_list, &list); in ext4_mb_discard_group_preallocations()
5549 list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) { in ext4_mb_discard_group_preallocations()
5552 if (pa->pa_type == MB_GROUP_PA) { in ext4_mb_discard_group_preallocations()
5553 spin_lock(pa->pa_node_lock.lg_lock); in ext4_mb_discard_group_preallocations()
5554 list_del_rcu(&pa->pa_node.lg_list); in ext4_mb_discard_group_preallocations()
5555 spin_unlock(pa->pa_node_lock.lg_lock); in ext4_mb_discard_group_preallocations()
5557 write_lock(pa->pa_node_lock.inode_lock); in ext4_mb_discard_group_preallocations()
5558 ei = EXT4_I(pa->pa_inode); in ext4_mb_discard_group_preallocations()
5559 rb_erase(&pa->pa_node.inode_node, &ei->i_prealloc_node); in ext4_mb_discard_group_preallocations()
5560 write_unlock(pa->pa_node_lock.inode_lock); in ext4_mb_discard_group_preallocations()
5563 list_del(&pa->u.pa_tmp_list); in ext4_mb_discard_group_preallocations()
5565 if (pa->pa_type == MB_GROUP_PA) { in ext4_mb_discard_group_preallocations()
5566 ext4_mb_release_group_pa(&e4b, pa); in ext4_mb_discard_group_preallocations()
5567 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_discard_group_preallocations()
5569 ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa); in ext4_mb_discard_group_preallocations()
5570 ext4_mb_pa_free(pa); in ext4_mb_discard_group_preallocations()
5597 struct ext4_prealloc_space *pa, *tmp; in ext4_discard_preallocations() local
5616 /* first, collect all pa's in the inode */ in ext4_discard_preallocations()
5620 pa = rb_entry(iter, struct ext4_prealloc_space, in ext4_discard_preallocations()
5622 BUG_ON(pa->pa_node_lock.inode_lock != &ei->i_prealloc_lock); in ext4_discard_preallocations()
5624 spin_lock(&pa->pa_lock); in ext4_discard_preallocations()
5625 if (atomic_read(&pa->pa_count)) { in ext4_discard_preallocations()
5628 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
5631 "uh-oh! used pa while discarding"); in ext4_discard_preallocations()
5637 if (pa->pa_deleted == 0) { in ext4_discard_preallocations()
5638 ext4_mb_mark_pa_deleted(sb, pa); in ext4_discard_preallocations()
5639 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
5640 rb_erase(&pa->pa_node.inode_node, &ei->i_prealloc_node); in ext4_discard_preallocations()
5641 list_add(&pa->u.pa_tmp_list, &list); in ext4_discard_preallocations()
5645 /* someone is deleting pa right now */ in ext4_discard_preallocations()
5646 spin_unlock(&pa->pa_lock); in ext4_discard_preallocations()
5650 * doesn't mean pa is already unlinked from in ext4_discard_preallocations()
5654 * pa from inode's list may access already in ext4_discard_preallocations()
5666 list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) { in ext4_discard_preallocations()
5667 BUG_ON(pa->pa_type != MB_INODE_PA); in ext4_discard_preallocations()
5668 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_discard_preallocations()
5688 list_del(&pa->pa_group_list); in ext4_discard_preallocations()
5689 ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa); in ext4_discard_preallocations()
5695 list_del(&pa->u.pa_tmp_list); in ext4_discard_preallocations()
5696 ext4_mb_pa_free(pa); in ext4_discard_preallocations()
5702 struct ext4_prealloc_space *pa; in ext4_mb_pa_alloc() local
5705 pa = kmem_cache_zalloc(ext4_pspace_cachep, GFP_NOFS); in ext4_mb_pa_alloc()
5706 if (!pa) in ext4_mb_pa_alloc()
5708 atomic_set(&pa->pa_count, 1); in ext4_mb_pa_alloc()
5709 ac->ac_pa = pa; in ext4_mb_pa_alloc()
5715 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_mb_pa_put_free() local
5717 BUG_ON(!pa); in ext4_mb_pa_put_free()
5719 WARN_ON(!atomic_dec_and_test(&pa->pa_count)); in ext4_mb_pa_put_free()
5722 * len of found blocks < len of requested blocks hence the PA has not in ext4_mb_pa_put_free()
5725 pa->pa_deleted = 1; in ext4_mb_pa_put_free()
5726 ext4_mb_pa_free(pa); in ext4_mb_pa_put_free()
5741 struct ext4_prealloc_space *pa; in ext4_mb_show_pa() local
5749 pa = list_entry(cur, struct ext4_prealloc_space, in ext4_mb_show_pa()
5751 spin_lock(&pa->pa_lock); in ext4_mb_show_pa()
5752 ext4_get_group_no_and_offset(sb, pa->pa_pstart, in ext4_mb_show_pa()
5754 spin_unlock(&pa->pa_lock); in ext4_mb_show_pa()
5755 mb_debug(sb, "PA:%u:%d:%d\n", i, start, in ext4_mb_show_pa()
5756 pa->pa_len); in ext4_mb_show_pa()
5792 mb_debug(sb, "used pa: %s, ", str_yes_no(ac->ac_pa)); in ext4_mb_show_ac()
5795 "group pa" : "inode pa"); in ext4_mb_show_ac()
5927 struct ext4_prealloc_space *pa, *tmp; in ext4_mb_discard_lg_preallocations() local
5932 list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[order], in ext4_mb_discard_lg_preallocations()
5935 spin_lock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
5936 if (atomic_read(&pa->pa_count)) { in ext4_mb_discard_lg_preallocations()
5938 * This is the pa that we just used in ext4_mb_discard_lg_preallocations()
5942 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
5945 if (pa->pa_deleted) { in ext4_mb_discard_lg_preallocations()
5946 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
5950 BUG_ON(pa->pa_type != MB_GROUP_PA); in ext4_mb_discard_lg_preallocations()
5953 ext4_mb_mark_pa_deleted(sb, pa); in ext4_mb_discard_lg_preallocations()
5954 spin_unlock(&pa->pa_lock); in ext4_mb_discard_lg_preallocations()
5956 list_del_rcu(&pa->pa_node.lg_list); in ext4_mb_discard_lg_preallocations()
5957 list_add(&pa->u.pa_tmp_list, &discard_list); in ext4_mb_discard_lg_preallocations()
5972 list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) { in ext4_mb_discard_lg_preallocations()
5975 group = ext4_get_group_number(sb, pa->pa_pstart); in ext4_mb_discard_lg_preallocations()
5984 list_del(&pa->pa_group_list); in ext4_mb_discard_lg_preallocations()
5985 ext4_mb_release_group_pa(&e4b, pa); in ext4_mb_discard_lg_preallocations()
5989 list_del(&pa->u.pa_tmp_list); in ext4_mb_discard_lg_preallocations()
5990 call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); in ext4_mb_discard_lg_preallocations()
6008 struct ext4_prealloc_space *tmp_pa, *pa = ac->ac_pa; in ext4_mb_add_n_trim() local
6010 order = fls(pa->pa_free) - 1; in ext4_mb_add_n_trim()
6024 if (!added && pa->pa_free < tmp_pa->pa_free) { in ext4_mb_add_n_trim()
6026 list_add_tail_rcu(&pa->pa_node.lg_list, in ext4_mb_add_n_trim()
6038 list_add_tail_rcu(&pa->pa_node.lg_list, in ext4_mb_add_n_trim()
6054 struct ext4_prealloc_space *pa = ac->ac_pa; in ext4_mb_release_context() local
6055 if (pa) { in ext4_mb_release_context()
6056 if (pa->pa_type == MB_GROUP_PA) { in ext4_mb_release_context()
6058 spin_lock(&pa->pa_lock); in ext4_mb_release_context()
6059 pa->pa_pstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len); in ext4_mb_release_context()
6060 pa->pa_lstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len); in ext4_mb_release_context()
6061 pa->pa_free -= ac->ac_b_ex.fe_len; in ext4_mb_release_context()
6062 pa->pa_len -= ac->ac_b_ex.fe_len; in ext4_mb_release_context()
6063 spin_unlock(&pa->pa_lock); in ext4_mb_release_context()
6066 * We want to add the pa to the right bucket. in ext4_mb_release_context()
6071 if (likely(pa->pa_free)) { in ext4_mb_release_context()
6072 spin_lock(pa->pa_node_lock.lg_lock); in ext4_mb_release_context()
6073 list_del_rcu(&pa->pa_node.lg_list); in ext4_mb_release_context()
6074 spin_unlock(pa->pa_node_lock.lg_lock); in ext4_mb_release_context()
6079 ext4_mb_put_pa(ac, ac->ac_sb, pa); in ext4_mb_release_context()
6297 * pa allocated above is added to grp->bb_prealloc_list only in ext4_mb_new_blocks()
6301 * So we have to free this pa here itself. in ext4_mb_new_blocks()
6326 * If block allocation fails then the pa allocated above in ext4_mb_new_blocks()