Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fc1829f3 authored by David Chinner's avatar David Chinner Committed by Lachlan McIlroy
Browse files

[XFS] Add ail pointer into log items



Add an xfs_ail pointer to log items so that the log items can reference
the AIL directly during callbacks without needed a struct xfs_mount.

SGI-PV: 988143

SGI-Modid: xfs-linux-melb:xfs-kern:32352a

Signed-off-by: default avatarDavid Chinner <david@fromorbit.com>
Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
Signed-off-by: default avatarChristoph Hellwig <hch@infradead.org>
parent a9c21c1b
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -731,6 +731,7 @@ xfs_buf_item_init(
	bip->bli_item.li_type = XFS_LI_BUF;
	bip->bli_item.li_ops = &xfs_buf_item_ops;
	bip->bli_item.li_mountp = mp;
	bip->bli_item.li_ailp = mp->m_ail;
	bip->bli_buf = bp;
	xfs_buf_hold(bp);
	bip->bli_format.blf_type = XFS_LI_BUF;
@@ -1123,11 +1124,13 @@ xfs_buf_iodone(
	xfs_buf_log_item_t	*bip)
{
	struct xfs_mount	*mp;
	struct xfs_ail		*ailp;

	ASSERT(bip->bli_buf == bp);

	xfs_buf_rele(bp);
	mp = bip->bli_item.li_mountp;
	ailp = bip->bli_item.li_ailp;

	/*
	 * If we are forcibly shutting down, this may well be
@@ -1138,7 +1141,7 @@ xfs_buf_iodone(
	 *
	 * Either way, AIL is useless if we're forcing a shutdown.
	 */
	spin_lock(&mp->m_ail->xa_lock);
	spin_lock(&ailp->xa_lock);
	/*
	 * xfs_trans_delete_ail() drops the AIL lock.
	 */
+18 −10
Original line number Diff line number Diff line
@@ -109,9 +109,11 @@ STATIC void
xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale)
{
	xfs_mount_t		*mp;
	struct xfs_ail		*ailp;

	mp = efip->efi_item.li_mountp;
	spin_lock(&mp->m_ail->xa_lock);
	ailp = efip->efi_item.li_ailp;
	spin_lock(&ailp->xa_lock);
	if (efip->efi_flags & XFS_EFI_CANCELED) {
		/*
		 * xfs_trans_delete_ail() drops the AIL lock.
@@ -120,7 +122,7 @@ xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale)
		xfs_efi_item_free(efip);
	} else {
		efip->efi_flags |= XFS_EFI_COMMITTED;
		spin_unlock(&mp->m_ail->xa_lock);
		spin_unlock(&ailp->xa_lock);
	}
}

@@ -135,10 +137,12 @@ STATIC void
xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp)
{
	xfs_mount_t		*mp;
	struct xfs_ail		*ailp;
	xfs_log_item_desc_t	*lidp;

	mp = efip->efi_item.li_mountp;
	spin_lock(&mp->m_ail->xa_lock);
	ailp = efip->efi_item.li_ailp;
	spin_lock(&ailp->xa_lock);
	if (efip->efi_flags & XFS_EFI_CANCELED) {
		/*
		 * free the xaction descriptor pointing to this item
@@ -153,7 +157,7 @@ xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp)
		xfs_efi_item_free(efip);
	} else {
		efip->efi_flags |= XFS_EFI_COMMITTED;
		spin_unlock(&mp->m_ail->xa_lock);
		spin_unlock(&ailp->xa_lock);
	}
}

@@ -268,6 +272,7 @@ xfs_efi_init(xfs_mount_t *mp,
	efip->efi_item.li_type = XFS_LI_EFI;
	efip->efi_item.li_ops = &xfs_efi_item_ops;
	efip->efi_item.li_mountp = mp;
	efip->efi_item.li_ailp = mp->m_ail;
	efip->efi_format.efi_nextents = nextents;
	efip->efi_format.efi_id = (__psint_t)(void*)efip;

@@ -346,13 +351,15 @@ xfs_efi_release(xfs_efi_log_item_t *efip,
		uint			nextents)
{
	xfs_mount_t		*mp;
	struct xfs_ail		*ailp;
	int			extents_left;

	mp = efip->efi_item.li_mountp;
	ailp = efip->efi_item.li_ailp;
	ASSERT(efip->efi_next_extent > 0);
	ASSERT(efip->efi_flags & XFS_EFI_COMMITTED);

	spin_lock(&mp->m_ail->xa_lock);
	spin_lock(&ailp->xa_lock);
	ASSERT(efip->efi_next_extent >= nextents);
	efip->efi_next_extent -= nextents;
	extents_left = efip->efi_next_extent;
@@ -363,7 +370,7 @@ xfs_efi_release(xfs_efi_log_item_t *efip,
		xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip);
		xfs_efi_item_free(efip);
	} else {
		spin_unlock(&mp->m_ail->xa_lock);
		spin_unlock(&ailp->xa_lock);
	}
}

@@ -565,6 +572,7 @@ xfs_efd_init(xfs_mount_t *mp,
	efdp->efd_item.li_type = XFS_LI_EFD;
	efdp->efd_item.li_ops = &xfs_efd_item_ops;
	efdp->efd_item.li_mountp = mp;
	efdp->efd_item.li_ailp = mp->m_ail;
	efdp->efd_efip = efip;
	efdp->efd_format.efd_nextents = nextents;
	efdp->efd_format.efd_efi_id = efip->efi_format.efi_id;
+1 −0
Original line number Diff line number Diff line
@@ -932,6 +932,7 @@ xfs_inode_item_init(
	iip->ili_item.li_type = XFS_LI_INODE;
	iip->ili_item.li_ops = &xfs_inode_item_ops;
	iip->ili_item.li_mountp = mp;
	iip->ili_item.li_ailp = mp->m_ail;
	iip->ili_inode = ip;

	/*
+6 −3
Original line number Diff line number Diff line
@@ -1383,11 +1383,13 @@ xfs_trans_chunk_committed(
	xfs_log_item_desc_t	*lidp;
	xfs_log_item_t		*lip;
	xfs_lsn_t		item_lsn;
	struct xfs_mount	*mp;
	int			i;

	lidp = licp->lic_descs;
	for (i = 0; i < licp->lic_unused; i++, lidp++) {
		struct xfs_mount	*mp;
		struct xfs_ail		*ailp;

		if (xfs_lic_isfree(licp, i)) {
			continue;
		}
@@ -1425,7 +1427,8 @@ xfs_trans_chunk_committed(
		 * the test below.
		 */
		mp = lip->li_mountp;
		spin_lock(&mp->m_ail->xa_lock);
		ailp = lip->li_ailp;
		spin_lock(&ailp->xa_lock);
		if (XFS_LSN_CMP(item_lsn, lip->li_lsn) > 0) {
			/*
			 * This will set the item's lsn to item_lsn
@@ -1436,7 +1439,7 @@ xfs_trans_chunk_committed(
			 */
			xfs_trans_update_ail(mp, lip, item_lsn);
		} else {
			spin_unlock(&mp->m_ail->xa_lock);
			spin_unlock(&ailp->xa_lock);
		}

		/*
+1 −0
Original line number Diff line number Diff line
@@ -768,6 +768,7 @@ typedef struct xfs_log_item {
	xfs_lsn_t			li_lsn;		/* last on-disk lsn */
	struct xfs_log_item_desc	*li_desc;	/* ptr to current desc*/
	struct xfs_mount		*li_mountp;	/* ptr to fs mount */
	struct xfs_ail			*li_ailp;	/* ptr to AIL */
	uint				li_type;	/* item type */
	uint				li_flags;	/* misc flags */
	struct xfs_log_item		*li_bio_list;	/* buffer item list */
Loading