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

[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
...@@ -731,6 +731,7 @@ xfs_buf_item_init( ...@@ -731,6 +731,7 @@ xfs_buf_item_init(
bip->bli_item.li_type = XFS_LI_BUF; bip->bli_item.li_type = XFS_LI_BUF;
bip->bli_item.li_ops = &xfs_buf_item_ops; bip->bli_item.li_ops = &xfs_buf_item_ops;
bip->bli_item.li_mountp = mp; bip->bli_item.li_mountp = mp;
bip->bli_item.li_ailp = mp->m_ail;
bip->bli_buf = bp; bip->bli_buf = bp;
xfs_buf_hold(bp); xfs_buf_hold(bp);
bip->bli_format.blf_type = XFS_LI_BUF; bip->bli_format.blf_type = XFS_LI_BUF;
...@@ -1123,11 +1124,13 @@ xfs_buf_iodone( ...@@ -1123,11 +1124,13 @@ xfs_buf_iodone(
xfs_buf_log_item_t *bip) xfs_buf_log_item_t *bip)
{ {
struct xfs_mount *mp; struct xfs_mount *mp;
struct xfs_ail *ailp;
ASSERT(bip->bli_buf == bp); ASSERT(bip->bli_buf == bp);
xfs_buf_rele(bp); xfs_buf_rele(bp);
mp = bip->bli_item.li_mountp; mp = bip->bli_item.li_mountp;
ailp = bip->bli_item.li_ailp;
/* /*
* If we are forcibly shutting down, this may well be * If we are forcibly shutting down, this may well be
...@@ -1138,7 +1141,7 @@ xfs_buf_iodone( ...@@ -1138,7 +1141,7 @@ xfs_buf_iodone(
* *
* Either way, AIL is useless if we're forcing a shutdown. * 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. * xfs_trans_delete_ail() drops the AIL lock.
*/ */
......
...@@ -109,9 +109,11 @@ STATIC void ...@@ -109,9 +109,11 @@ STATIC void
xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale) xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale)
{ {
xfs_mount_t *mp; xfs_mount_t *mp;
struct xfs_ail *ailp;
mp = efip->efi_item.li_mountp; 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) { if (efip->efi_flags & XFS_EFI_CANCELED) {
/* /*
* xfs_trans_delete_ail() drops the AIL lock. * xfs_trans_delete_ail() drops the AIL lock.
...@@ -120,7 +122,7 @@ xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale) ...@@ -120,7 +122,7 @@ xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale)
xfs_efi_item_free(efip); xfs_efi_item_free(efip);
} else { } else {
efip->efi_flags |= XFS_EFI_COMMITTED; efip->efi_flags |= XFS_EFI_COMMITTED;
spin_unlock(&mp->m_ail->xa_lock); spin_unlock(&ailp->xa_lock);
} }
} }
...@@ -135,10 +137,12 @@ STATIC void ...@@ -135,10 +137,12 @@ STATIC void
xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp)
{ {
xfs_mount_t *mp; xfs_mount_t *mp;
struct xfs_ail *ailp;
xfs_log_item_desc_t *lidp; xfs_log_item_desc_t *lidp;
mp = efip->efi_item.li_mountp; 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) { if (efip->efi_flags & XFS_EFI_CANCELED) {
/* /*
* free the xaction descriptor pointing to this item * 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) ...@@ -153,7 +157,7 @@ xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp)
xfs_efi_item_free(efip); xfs_efi_item_free(efip);
} else { } else {
efip->efi_flags |= XFS_EFI_COMMITTED; 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, ...@@ -268,6 +272,7 @@ xfs_efi_init(xfs_mount_t *mp,
efip->efi_item.li_type = XFS_LI_EFI; efip->efi_item.li_type = XFS_LI_EFI;
efip->efi_item.li_ops = &xfs_efi_item_ops; efip->efi_item.li_ops = &xfs_efi_item_ops;
efip->efi_item.li_mountp = mp; efip->efi_item.li_mountp = mp;
efip->efi_item.li_ailp = mp->m_ail;
efip->efi_format.efi_nextents = nextents; efip->efi_format.efi_nextents = nextents;
efip->efi_format.efi_id = (__psint_t)(void*)efip; efip->efi_format.efi_id = (__psint_t)(void*)efip;
...@@ -346,13 +351,15 @@ xfs_efi_release(xfs_efi_log_item_t *efip, ...@@ -346,13 +351,15 @@ xfs_efi_release(xfs_efi_log_item_t *efip,
uint nextents) uint nextents)
{ {
xfs_mount_t *mp; xfs_mount_t *mp;
struct xfs_ail *ailp;
int extents_left; int extents_left;
mp = efip->efi_item.li_mountp; mp = efip->efi_item.li_mountp;
ailp = efip->efi_item.li_ailp;
ASSERT(efip->efi_next_extent > 0); ASSERT(efip->efi_next_extent > 0);
ASSERT(efip->efi_flags & XFS_EFI_COMMITTED); 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); ASSERT(efip->efi_next_extent >= nextents);
efip->efi_next_extent -= nextents; efip->efi_next_extent -= nextents;
extents_left = efip->efi_next_extent; extents_left = efip->efi_next_extent;
...@@ -363,7 +370,7 @@ xfs_efi_release(xfs_efi_log_item_t *efip, ...@@ -363,7 +370,7 @@ xfs_efi_release(xfs_efi_log_item_t *efip,
xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip); xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip);
xfs_efi_item_free(efip); xfs_efi_item_free(efip);
} else { } else {
spin_unlock(&mp->m_ail->xa_lock); spin_unlock(&ailp->xa_lock);
} }
} }
...@@ -565,6 +572,7 @@ xfs_efd_init(xfs_mount_t *mp, ...@@ -565,6 +572,7 @@ xfs_efd_init(xfs_mount_t *mp,
efdp->efd_item.li_type = XFS_LI_EFD; efdp->efd_item.li_type = XFS_LI_EFD;
efdp->efd_item.li_ops = &xfs_efd_item_ops; efdp->efd_item.li_ops = &xfs_efd_item_ops;
efdp->efd_item.li_mountp = mp; efdp->efd_item.li_mountp = mp;
efdp->efd_item.li_ailp = mp->m_ail;
efdp->efd_efip = efip; efdp->efd_efip = efip;
efdp->efd_format.efd_nextents = nextents; efdp->efd_format.efd_nextents = nextents;
efdp->efd_format.efd_efi_id = efip->efi_format.efi_id; efdp->efd_format.efd_efi_id = efip->efi_format.efi_id;
......
...@@ -932,6 +932,7 @@ xfs_inode_item_init( ...@@ -932,6 +932,7 @@ xfs_inode_item_init(
iip->ili_item.li_type = XFS_LI_INODE; iip->ili_item.li_type = XFS_LI_INODE;
iip->ili_item.li_ops = &xfs_inode_item_ops; iip->ili_item.li_ops = &xfs_inode_item_ops;
iip->ili_item.li_mountp = mp; iip->ili_item.li_mountp = mp;
iip->ili_item.li_ailp = mp->m_ail;
iip->ili_inode = ip; iip->ili_inode = ip;
/* /*
......
...@@ -1383,11 +1383,13 @@ xfs_trans_chunk_committed( ...@@ -1383,11 +1383,13 @@ xfs_trans_chunk_committed(
xfs_log_item_desc_t *lidp; xfs_log_item_desc_t *lidp;
xfs_log_item_t *lip; xfs_log_item_t *lip;
xfs_lsn_t item_lsn; xfs_lsn_t item_lsn;
struct xfs_mount *mp;
int i; int i;
lidp = licp->lic_descs; lidp = licp->lic_descs;
for (i = 0; i < licp->lic_unused; i++, lidp++) { for (i = 0; i < licp->lic_unused; i++, lidp++) {
struct xfs_mount *mp;
struct xfs_ail *ailp;
if (xfs_lic_isfree(licp, i)) { if (xfs_lic_isfree(licp, i)) {
continue; continue;
} }
...@@ -1425,7 +1427,8 @@ xfs_trans_chunk_committed( ...@@ -1425,7 +1427,8 @@ xfs_trans_chunk_committed(
* the test below. * the test below.
*/ */
mp = lip->li_mountp; 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) { if (XFS_LSN_CMP(item_lsn, lip->li_lsn) > 0) {
/* /*
* This will set the item's lsn to item_lsn * This will set the item's lsn to item_lsn
...@@ -1436,7 +1439,7 @@ xfs_trans_chunk_committed( ...@@ -1436,7 +1439,7 @@ xfs_trans_chunk_committed(
*/ */
xfs_trans_update_ail(mp, lip, item_lsn); xfs_trans_update_ail(mp, lip, item_lsn);
} else { } else {
spin_unlock(&mp->m_ail->xa_lock); spin_unlock(&ailp->xa_lock);
} }
/* /*
......
...@@ -768,6 +768,7 @@ typedef struct xfs_log_item { ...@@ -768,6 +768,7 @@ typedef struct xfs_log_item {
xfs_lsn_t li_lsn; /* last on-disk lsn */ xfs_lsn_t li_lsn; /* last on-disk lsn */
struct xfs_log_item_desc *li_desc; /* ptr to current desc*/ struct xfs_log_item_desc *li_desc; /* ptr to current desc*/
struct xfs_mount *li_mountp; /* ptr to fs mount */ struct xfs_mount *li_mountp; /* ptr to fs mount */
struct xfs_ail *li_ailp; /* ptr to AIL */
uint li_type; /* item type */ uint li_type; /* item type */
uint li_flags; /* misc flags */ uint li_flags; /* misc flags */
struct xfs_log_item *li_bio_list; /* buffer item list */ struct xfs_log_item *li_bio_list; /* buffer item list */
......
...@@ -22,6 +22,14 @@ ...@@ -22,6 +22,14 @@
#include "xfs_inum.h" #include "xfs_inum.h"
#include "xfs_trans.h" #include "xfs_trans.h"
#include "xfs_trans_priv.h" #include "xfs_trans_priv.h"
/* XXX: from here down needed until struct xfs_trans has it's own ailp */
#include "xfs_bit.h"
#include "xfs_buf_item.h"
#include "xfs_sb.h"
#include "xfs_ag.h"
#include "xfs_dir2.h"
#include "xfs_dmapi.h"
#include "xfs_mount.h"
STATIC int xfs_trans_unlock_chunk(xfs_log_item_chunk_t *, STATIC int xfs_trans_unlock_chunk(xfs_log_item_chunk_t *,
int, int, xfs_lsn_t); int, int, xfs_lsn_t);
...@@ -79,6 +87,7 @@ xfs_trans_add_item(xfs_trans_t *tp, xfs_log_item_t *lip) ...@@ -79,6 +87,7 @@ xfs_trans_add_item(xfs_trans_t *tp, xfs_log_item_t *lip)
lidp->lid_size = 0; lidp->lid_size = 0;
lip->li_desc = lidp; lip->li_desc = lidp;
lip->li_mountp = tp->t_mountp; lip->li_mountp = tp->t_mountp;
lip->li_ailp = tp->t_mountp->m_ail;
return lidp; return lidp;
} }
...@@ -120,6 +129,7 @@ xfs_trans_add_item(xfs_trans_t *tp, xfs_log_item_t *lip) ...@@ -120,6 +129,7 @@ xfs_trans_add_item(xfs_trans_t *tp, xfs_log_item_t *lip)
lidp->lid_size = 0; lidp->lid_size = 0;
lip->li_desc = lidp; lip->li_desc = lidp;
lip->li_mountp = tp->t_mountp; lip->li_mountp = tp->t_mountp;
lip->li_ailp = tp->t_mountp->m_ail;
return lidp; return lidp;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment