Lines Matching refs:ailp
34 struct xfs_ail *ailp, in xfs_ail_check() argument
36 __must_hold(&ailp->ail_lock) in xfs_ail_check()
46 if (list_empty(&ailp->ail_head)) in xfs_ail_check()
54 if (&prev_lip->li_ail != &ailp->ail_head) in xfs_ail_check()
57 if (&next_lip->li_ail != &ailp->ail_head) in xfs_ail_check()
66 spin_unlock(&ailp->ail_lock); in xfs_ail_check()
70 spin_lock(&ailp->ail_lock); in xfs_ail_check()
82 struct xfs_ail *ailp) in xfs_ail_max() argument
84 if (list_empty(&ailp->ail_head)) in xfs_ail_max()
87 return list_entry(ailp->ail_head.prev, struct xfs_log_item, li_ail); in xfs_ail_max()
96 struct xfs_ail *ailp, in xfs_ail_next() argument
99 if (lip->li_ail.next == &ailp->ail_head) in xfs_ail_next()
115 struct xfs_ail *ailp) in __xfs_ail_min_lsn() argument
117 struct xfs_log_item *lip = xfs_ail_min(ailp); in __xfs_ail_min_lsn()
126 struct xfs_ail *ailp) in xfs_ail_min_lsn() argument
130 spin_lock(&ailp->ail_lock); in xfs_ail_min_lsn()
131 lsn = __xfs_ail_min_lsn(ailp); in xfs_ail_min_lsn()
132 spin_unlock(&ailp->ail_lock); in xfs_ail_min_lsn()
142 struct xfs_ail *ailp) in xfs_ail_max_lsn() argument
147 spin_lock(&ailp->ail_lock); in xfs_ail_max_lsn()
148 lip = xfs_ail_max(ailp); in xfs_ail_max_lsn()
151 spin_unlock(&ailp->ail_lock); in xfs_ail_max_lsn()
165 struct xfs_ail *ailp, in xfs_trans_ail_cursor_init() argument
169 list_add_tail(&cur->list, &ailp->ail_cursors); in xfs_trans_ail_cursor_init()
178 struct xfs_ail *ailp, in xfs_trans_ail_cursor_next() argument
184 lip = xfs_ail_min(ailp); in xfs_trans_ail_cursor_next()
186 cur->item = xfs_ail_next(ailp, lip); in xfs_trans_ail_cursor_next()
212 struct xfs_ail *ailp, in xfs_trans_ail_cursor_clear() argument
217 list_for_each_entry(cur, &ailp->ail_cursors, list) { in xfs_trans_ail_cursor_clear()
232 struct xfs_ail *ailp, in xfs_trans_ail_cursor_first() argument
238 xfs_trans_ail_cursor_init(ailp, cur); in xfs_trans_ail_cursor_first()
241 lip = xfs_ail_min(ailp); in xfs_trans_ail_cursor_first()
245 list_for_each_entry(lip, &ailp->ail_head, li_ail) { in xfs_trans_ail_cursor_first()
253 cur->item = xfs_ail_next(ailp, lip); in xfs_trans_ail_cursor_first()
259 struct xfs_ail *ailp, in __xfs_trans_ail_cursor_last() argument
264 list_for_each_entry_reverse(lip, &ailp->ail_head, li_ail) { in __xfs_trans_ail_cursor_last()
279 struct xfs_ail *ailp, in xfs_trans_ail_cursor_last() argument
283 xfs_trans_ail_cursor_init(ailp, cur); in xfs_trans_ail_cursor_last()
284 cur->item = __xfs_trans_ail_cursor_last(ailp, lsn); in xfs_trans_ail_cursor_last()
296 struct xfs_ail *ailp, in xfs_ail_splice() argument
312 lip = __xfs_trans_ail_cursor_last(ailp, lsn); in xfs_ail_splice()
333 list_splice(list, &ailp->ail_head); in xfs_ail_splice()
341 struct xfs_ail *ailp, in xfs_ail_delete() argument
344 xfs_ail_check(ailp, lip); in xfs_ail_delete()
346 xfs_trans_ail_cursor_clear(ailp, lip); in xfs_ail_delete()
394 struct xfs_ail *ailp, in xfsaild_push_item() argument
401 if (XFS_TEST_ERROR(false, ailp->ail_log->l_mp, XFS_ERRTAG_LOG_ITEM_PIN)) in xfsaild_push_item()
413 return xfsaild_resubmit_item(lip, &ailp->ail_buf_list); in xfsaild_push_item()
414 return lip->li_ops->iop_push(lip, &ailp->ail_buf_list); in xfsaild_push_item()
419 struct xfs_ail *ailp) in xfsaild_push() argument
421 struct xfs_mount *mp = ailp->ail_log->l_mp; in xfsaild_push()
440 if (ailp->ail_log_flush && ailp->ail_last_pushed_lsn == 0 && in xfsaild_push()
441 (!list_empty_careful(&ailp->ail_buf_list) || in xfsaild_push()
442 xfs_ail_min_lsn(ailp))) { in xfsaild_push()
443 ailp->ail_log_flush = 0; in xfsaild_push()
446 xlog_cil_flush(ailp->ail_log); in xfsaild_push()
449 spin_lock(&ailp->ail_lock); in xfsaild_push()
457 if (waitqueue_active(&ailp->ail_empty)) { in xfsaild_push()
458 lip = xfs_ail_max(ailp); in xfsaild_push()
464 target = ailp->ail_target; in xfsaild_push()
465 ailp->ail_target_prev = target; in xfsaild_push()
469 lip = xfs_trans_ail_cursor_first(ailp, &cur, ailp->ail_last_pushed_lsn); in xfsaild_push()
484 lock_result = xfsaild_push_item(ailp, lip); in xfsaild_push()
490 ailp->ail_last_pushed_lsn = lsn; in xfsaild_push()
509 ailp->ail_last_pushed_lsn = lsn; in xfsaild_push()
517 ailp->ail_log_flush++; in xfsaild_push()
548 lip = xfs_trans_ail_cursor_next(ailp, &cur); in xfsaild_push()
556 spin_unlock(&ailp->ail_lock); in xfsaild_push()
558 if (xfs_buf_delwri_submit_nowait(&ailp->ail_buf_list)) in xfsaild_push()
559 ailp->ail_log_flush++; in xfsaild_push()
568 ailp->ail_last_pushed_lsn = 0; in xfsaild_push()
581 ailp->ail_last_pushed_lsn = 0; in xfsaild_push()
596 struct xfs_ail *ailp = data; in xfsaild() local
634 ASSERT(list_empty(&ailp->ail_buf_list) || in xfsaild()
635 xlog_is_shutdown(ailp->ail_log)); in xfsaild()
636 xfs_buf_delwri_cancel(&ailp->ail_buf_list); in xfsaild()
640 spin_lock(&ailp->ail_lock); in xfsaild()
652 if (!xfs_ail_min(ailp) && in xfsaild()
653 ailp->ail_target == ailp->ail_target_prev && in xfsaild()
654 list_empty(&ailp->ail_buf_list)) { in xfsaild()
655 spin_unlock(&ailp->ail_lock); in xfsaild()
660 spin_unlock(&ailp->ail_lock); in xfsaild()
669 tout = xfsaild_push(ailp); in xfsaild()
692 struct xfs_ail *ailp, in xfs_ail_push() argument
697 lip = xfs_ail_min(ailp); in xfs_ail_push()
698 if (!lip || xlog_is_shutdown(ailp->ail_log) || in xfs_ail_push()
699 XFS_LSN_CMP(threshold_lsn, ailp->ail_target) <= 0) in xfs_ail_push()
707 xfs_trans_ail_copy_lsn(ailp, &ailp->ail_target, &threshold_lsn); in xfs_ail_push()
710 wake_up_process(ailp->ail_task); in xfs_ail_push()
718 struct xfs_ail *ailp) in xfs_ail_push_all() argument
720 xfs_lsn_t threshold_lsn = xfs_ail_max_lsn(ailp); in xfs_ail_push_all()
723 xfs_ail_push(ailp, threshold_lsn); in xfs_ail_push_all()
731 struct xfs_ail *ailp) in xfs_ail_push_all_sync() argument
735 spin_lock(&ailp->ail_lock); in xfs_ail_push_all_sync()
736 while (xfs_ail_max(ailp) != NULL) { in xfs_ail_push_all_sync()
737 prepare_to_wait(&ailp->ail_empty, &wait, TASK_UNINTERRUPTIBLE); in xfs_ail_push_all_sync()
738 wake_up_process(ailp->ail_task); in xfs_ail_push_all_sync()
739 spin_unlock(&ailp->ail_lock); in xfs_ail_push_all_sync()
741 spin_lock(&ailp->ail_lock); in xfs_ail_push_all_sync()
743 spin_unlock(&ailp->ail_lock); in xfs_ail_push_all_sync()
745 finish_wait(&ailp->ail_empty, &wait); in xfs_ail_push_all_sync()
750 struct xfs_ail *ailp, in xfs_ail_update_finish() argument
751 xfs_lsn_t old_lsn) __releases(ailp->ail_lock) in xfs_ail_update_finish()
753 struct xlog *log = ailp->ail_log; in xfs_ail_update_finish()
756 if (!old_lsn || old_lsn == __xfs_ail_min_lsn(ailp)) { in xfs_ail_update_finish()
757 spin_unlock(&ailp->ail_lock); in xfs_ail_update_finish()
764 if (list_empty(&ailp->ail_head)) in xfs_ail_update_finish()
765 wake_up_all(&ailp->ail_empty); in xfs_ail_update_finish()
766 spin_unlock(&ailp->ail_lock); in xfs_ail_update_finish()
794 struct xfs_ail *ailp, in xfs_trans_ail_update_bulk() argument
798 xfs_lsn_t lsn) __releases(ailp->ail_lock) in xfs_trans_ail_update_bulk()
806 mlip = xfs_ail_min(ailp); in xfs_trans_ail_update_bulk()
819 xfs_ail_delete(ailp, lip); in xfs_trans_ail_update_bulk()
828 xfs_ail_splice(ailp, cur, &tmp, lsn); in xfs_trans_ail_update_bulk()
830 xfs_ail_update_finish(ailp, tail_lsn); in xfs_trans_ail_update_bulk()
836 struct xfs_ail *ailp, in xfs_trans_ail_insert() argument
840 spin_lock(&ailp->ail_lock); in xfs_trans_ail_insert()
841 xfs_trans_ail_update_bulk(ailp, NULL, &lip, 1, lsn); in xfs_trans_ail_insert()
853 struct xfs_ail *ailp, in xfs_ail_delete_one() argument
856 struct xfs_log_item *mlip = xfs_ail_min(ailp); in xfs_ail_delete_one()
860 xfs_ail_delete(ailp, lip); in xfs_ail_delete_one()
874 struct xfs_ail *ailp = lip->li_ailp; in xfs_trans_ail_delete() local
875 struct xlog *log = ailp->ail_log; in xfs_trans_ail_delete()
878 spin_lock(&ailp->ail_lock); in xfs_trans_ail_delete()
880 spin_unlock(&ailp->ail_lock); in xfs_trans_ail_delete()
892 tail_lsn = xfs_ail_delete_one(ailp, lip); in xfs_trans_ail_delete()
893 xfs_ail_update_finish(ailp, tail_lsn); in xfs_trans_ail_delete()
900 struct xfs_ail *ailp; in xfs_trans_ail_init() local
902 ailp = kmem_zalloc(sizeof(struct xfs_ail), KM_MAYFAIL); in xfs_trans_ail_init()
903 if (!ailp) in xfs_trans_ail_init()
906 ailp->ail_log = mp->m_log; in xfs_trans_ail_init()
907 INIT_LIST_HEAD(&ailp->ail_head); in xfs_trans_ail_init()
908 INIT_LIST_HEAD(&ailp->ail_cursors); in xfs_trans_ail_init()
909 spin_lock_init(&ailp->ail_lock); in xfs_trans_ail_init()
910 INIT_LIST_HEAD(&ailp->ail_buf_list); in xfs_trans_ail_init()
911 init_waitqueue_head(&ailp->ail_empty); in xfs_trans_ail_init()
913 ailp->ail_task = kthread_run(xfsaild, ailp, "xfsaild/%s", in xfs_trans_ail_init()
915 if (IS_ERR(ailp->ail_task)) in xfs_trans_ail_init()
918 mp->m_ail = ailp; in xfs_trans_ail_init()
922 kmem_free(ailp); in xfs_trans_ail_init()
930 struct xfs_ail *ailp = mp->m_ail; in xfs_trans_ail_destroy() local
932 kthread_stop(ailp->ail_task); in xfs_trans_ail_destroy()
933 kmem_free(ailp); in xfs_trans_ail_destroy()