*/
mp = log->l_mp;
spin_lock(&mp->m_ail_lock);
- xfs_trans_ail_cursor_init(mp->m_ail, &cur);
- lip = xfs_trans_first_ail(mp, &cur);
+ lip = xfs_trans_ail_cursor_first(mp->m_ail, &cur, 0);
while (lip != NULL) {
if (lip->li_type == XFS_LI_EFI) {
efip = (xfs_efi_log_item_t *)lip;
break;
}
}
- lip = xfs_trans_next_ail(mp, &cur);
+ lip = xfs_trans_ail_cursor_next(mp->m_ail, &cur);
}
xfs_trans_ail_cursor_done(mp->m_ail, &cur);
spin_unlock(&mp->m_ail_lock);
mp = log->l_mp;
spin_lock(&mp->m_ail_lock);
- xfs_trans_ail_cursor_init(mp->m_ail, &cur);
- lip = xfs_trans_first_ail(mp, &cur);
+ lip = xfs_trans_ail_cursor_first(mp->m_ail, &cur, 0);
while (lip != NULL) {
/*
* We're done when we see something other than an EFI.
*/
if (lip->li_type != XFS_LI_EFI) {
#ifdef DEBUG
- for (; lip; lip = xfs_trans_next_ail(mp, &cur))
+ for (; lip;
+ lip = xfs_trans_ail_cursor_next(mp->m_ail, &cur))
ASSERT(lip->li_type != XFS_LI_EFI);
#endif
break;
*/
efip = (xfs_efi_log_item_t *)lip;
if (efip->efi_flags & XFS_EFI_RECOVERED) {
- lip = xfs_trans_next_ail(mp, &cur);
+ lip = xfs_trans_ail_cursor_next(mp->m_ail, &cur);
continue;
}
spin_lock(&mp->m_ail_lock);
if (error)
goto out;
- lip = xfs_trans_next_ail(mp, &cur);
+ lip = xfs_trans_ail_cursor_next(mp->m_ail, &cur);
}
out:
xfs_trans_ail_cursor_done(mp->m_ail, &cur);
* lsn of the last item in the AIL.
*/
xfs_lsn_t
-xfs_trans_tail_ail(
- xfs_mount_t *mp)
+xfs_trans_ail_tail(
+ struct xfs_ail *ailp)
{
xfs_lsn_t lsn;
xfs_log_item_t *lip;
- spin_lock(&mp->m_ail_lock);
- lip = xfs_ail_min(mp->m_ail);
+ spin_lock(&ailp->xa_mount->m_ail_lock);
+ lip = xfs_ail_min(ailp);
if (lip == NULL) {
lsn = (xfs_lsn_t)0;
} else {
lsn = lip->li_lsn;
}
- spin_unlock(&mp->m_ail_lock);
+ spin_unlock(&ailp->xa_mount->m_ail_lock);
return lsn;
}
* We don't link the push cursor because it is embedded in the struct
* xfs_ail and hence easily findable.
*/
-void
+STATIC void
xfs_trans_ail_cursor_init(
struct xfs_ail *ailp,
struct xfs_ail_cursor *cur)
* If the cursor was invalidated (inidicated by a lip of 1),
* restart the traversal.
*/
-STATIC struct xfs_log_item *
+struct xfs_log_item *
xfs_trans_ail_cursor_next(
struct xfs_ail *ailp,
struct xfs_ail_cursor *cur)
}
/*
- * Invalidate any cursor that is pointing to this item. This is
- * called when an item is removed from the AIL. Any cursor pointing
- * to this object is now invalid and the traversal needs to be
- * terminated so it doesn't reference a freed object. We set the
- * cursor item to a value of 1 so we can distinguish between an
- * invalidation and the end of the list when getting the next item
- * from the cursor.
- */
-STATIC void
-xfs_trans_ail_cursor_clear(
- struct xfs_ail *ailp,
- struct xfs_log_item *lip)
-{
- struct xfs_ail_cursor *cur;
-
- /* need to search all cursors */
- for (cur = &ailp->xa_cursors; cur; cur = cur->next) {
- if (cur->item == lip)
- cur->item = (struct xfs_log_item *)
- ((__psint_t)cur->item | 1);
- }
-}
-
-/*
* Now that the traversal is complete, we need to remove the cursor
* from the list of traversing cursors. Avoid removing the embedded
* push cursor, but use the fact it is alway present to make the
}
/*
+ * Invalidate any cursor that is pointing to this item. This is
+ * called when an item is removed from the AIL. Any cursor pointing
+ * to this object is now invalid and the traversal needs to be
+ * terminated so it doesn't reference a freed object. We set the
+ * cursor item to a value of 1 so we can distinguish between an
+ * invalidation and the end of the list when getting the next item
+ * from the cursor.
+ */
+STATIC void
+xfs_trans_ail_cursor_clear(
+ struct xfs_ail *ailp,
+ struct xfs_log_item *lip)
+{
+ struct xfs_ail_cursor *cur;
+
+ /* need to search all cursors */
+ for (cur = &ailp->xa_cursors; cur; cur = cur->next) {
+ if (cur->item == lip)
+ cur->item = (struct xfs_log_item *)
+ ((__psint_t)cur->item | 1);
+ }
+}
+
+/*
* Return the item in the AIL with the current lsn.
* Return the current tree generation number for use
* in calls to xfs_trans_next_ail().
*/
-STATIC xfs_log_item_t *
-xfs_trans_first_push_ail(
+xfs_log_item_t *
+xfs_trans_ail_cursor_first(
struct xfs_ail *ailp,
struct xfs_ail_cursor *cur,
xfs_lsn_t lsn)
{
xfs_log_item_t *lip;
+ xfs_trans_ail_cursor_init(ailp, cur);
lip = xfs_ail_min(ailp);
- xfs_trans_ail_cursor_set(ailp, cur, lip);
if (lsn == 0)
- return lip;
+ goto out;
list_for_each_entry(lip, &ailp->xa_ail, li_ail) {
- if (XFS_LSN_CMP(lip->li_lsn, lsn) >= 0) {
- xfs_trans_ail_cursor_set(ailp, cur, lip);
- return lip;
- }
+ if (XFS_LSN_CMP(lip->li_lsn, lsn) >= 0)
+ break;
}
-
- return NULL;
+ lip = NULL;
+out:
+ xfs_trans_ail_cursor_set(ailp, cur, lip);
+ return lip;
}
/*
spin_lock(&mp->m_ail_lock);
xfs_trans_ail_cursor_init(ailp, cur);
- lip = xfs_trans_first_push_ail(ailp, cur, *last_lsn);
+ lip = xfs_trans_ail_cursor_first(ailp, cur, *last_lsn);
if (!lip || XFS_FORCED_SHUTDOWN(mp)) {
/*
* AIL is empty or our push has reached the end.
/*
- * Return the item in the AIL with the smallest lsn.
- * Return the current tree generation number for use
- * in calls to xfs_trans_next_ail().
- */
-xfs_log_item_t *
-xfs_trans_first_ail(
- struct xfs_mount *mp,
- struct xfs_ail_cursor *cur)
-{
- xfs_log_item_t *lip;
- struct xfs_ail *ailp = mp->m_ail;
-
- lip = xfs_ail_min(ailp);
- xfs_trans_ail_cursor_set(ailp, cur, lip);
-
- return lip;
-}
-
-/*
- * Grab the next item in the AIL from the cursor passed in.
- */
-xfs_log_item_t *
-xfs_trans_next_ail(
- struct xfs_mount *mp,
- struct xfs_ail_cursor *cur)
-{
- struct xfs_ail *ailp = mp->m_ail;
-
- return xfs_trans_ail_cursor_next(ailp, cur);
-}
-
-
-/*
* The active item list (AIL) is a doubly linked list of log
* items sorted by ascending lsn. The base of the list is
* a forw/back pointer pair embedded in the xfs mount structure.
void xfs_trans_delete_ail(struct xfs_mount *mp,
struct xfs_log_item *lip)
__releases(mp->m_ail_lock);
-struct xfs_log_item *xfs_trans_first_ail(struct xfs_mount *mp,
- struct xfs_ail_cursor *cur);
-struct xfs_log_item *xfs_trans_next_ail(struct xfs_mount *mp,
- struct xfs_ail_cursor *cur);
-void xfs_trans_ail_cursor_init(struct xfs_ail *ailp,
+xfs_lsn_t xfs_trans_ail_tail(struct xfs_ail *ailp);
+
+struct xfs_log_item *xfs_trans_ail_cursor_first(struct xfs_ail *ailp,
+ struct xfs_ail_cursor *cur,
+ xfs_lsn_t lsn);
+struct xfs_log_item *xfs_trans_ail_cursor_next(struct xfs_ail *ailp,
struct xfs_ail_cursor *cur);
-void xfs_trans_ail_cursor_done(struct xfs_ail *ailp,
+void xfs_trans_ail_cursor_done(struct xfs_ail *ailp,
struct xfs_ail_cursor *cur);
long xfsaild_push(struct xfs_ail *, xfs_lsn_t *);