aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_inode.c
diff options
context:
space:
mode:
authorDavid Chinner <david@fromorbit.com>2008-10-30 02:39:12 -0400
committerLachlan McIlroy <lachlan@sgi.com>2008-10-30 02:39:12 -0400
commit7b2e2a31f5c23b5f028af8c895137b4c512cc1c8 (patch)
treec37aa7117a16ebcd01d0ac2687b944e5dd8a7361 /fs/xfs/xfs_inode.c
parent5b00f14fbd60d42441f78c0e414a539cbfba5cb9 (diff)
[XFS] Allow 64 bit machines to avoid the AIL lock during flushes
When copying lsn's from the log item to the inode or dquot flush lsn, we currently grab the AIL lock. We do this because the LSN is a 64 bit quantity and it needs to be read atomically. The lock is used to guarantee atomicity for 32 bit platforms. Make the LSN copying a small function, and make the function used conditional on BITS_PER_LONG so that 64 bit machines don't need to take the AIL lock in these places. SGI-PV: 988143 SGI-Modid: xfs-linux-melb:xfs-kern:32349a Signed-off-by: David Chinner <david@fromorbit.com> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com> Signed-off-by: Christoph Hellwig <hch@infradead.org>
Diffstat (limited to 'fs/xfs/xfs_inode.c')
-rw-r--r--fs/xfs/xfs_inode.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 4eb629f0513e..2951ffd83066 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -2214,9 +2214,9 @@ xfs_ifree_cluster(
2214 iip = (xfs_inode_log_item_t *)lip; 2214 iip = (xfs_inode_log_item_t *)lip;
2215 ASSERT(iip->ili_logged == 1); 2215 ASSERT(iip->ili_logged == 1);
2216 lip->li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) xfs_istale_done; 2216 lip->li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) xfs_istale_done;
2217 spin_lock(&mp->m_ail_lock); 2217 xfs_trans_ail_copy_lsn(mp->m_ail,
2218 iip->ili_flush_lsn = iip->ili_item.li_lsn; 2218 &iip->ili_flush_lsn,
2219 spin_unlock(&mp->m_ail_lock); 2219 &iip->ili_item.li_lsn);
2220 xfs_iflags_set(iip->ili_inode, XFS_ISTALE); 2220 xfs_iflags_set(iip->ili_inode, XFS_ISTALE);
2221 pre_flushed++; 2221 pre_flushed++;
2222 } 2222 }
@@ -2237,9 +2237,8 @@ xfs_ifree_cluster(
2237 iip->ili_last_fields = iip->ili_format.ilf_fields; 2237 iip->ili_last_fields = iip->ili_format.ilf_fields;
2238 iip->ili_format.ilf_fields = 0; 2238 iip->ili_format.ilf_fields = 0;
2239 iip->ili_logged = 1; 2239 iip->ili_logged = 1;
2240 spin_lock(&mp->m_ail_lock); 2240 xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn,
2241 iip->ili_flush_lsn = iip->ili_item.li_lsn; 2241 &iip->ili_item.li_lsn);
2242 spin_unlock(&mp->m_ail_lock);
2243 2242
2244 xfs_buf_attach_iodone(bp, 2243 xfs_buf_attach_iodone(bp,
2245 (void(*)(xfs_buf_t*,xfs_log_item_t*)) 2244 (void(*)(xfs_buf_t*,xfs_log_item_t*))
@@ -3476,10 +3475,8 @@ xfs_iflush_int(
3476 iip->ili_format.ilf_fields = 0; 3475 iip->ili_format.ilf_fields = 0;
3477 iip->ili_logged = 1; 3476 iip->ili_logged = 1;
3478 3477
3479 ASSERT(sizeof(xfs_lsn_t) == 8); /* don't lock if it shrinks */ 3478 xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn,
3480 spin_lock(&mp->m_ail_lock); 3479 &iip->ili_item.li_lsn);
3481 iip->ili_flush_lsn = iip->ili_item.li_lsn;
3482 spin_unlock(&mp->m_ail_lock);
3483 3480
3484 /* 3481 /*
3485 * Attach the function xfs_iflush_done to the inode's 3482 * Attach the function xfs_iflush_done to the inode's