aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_inode_item.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2011-12-18 15:00:09 -0500
committerBen Myers <bpm@sgi.com>2012-01-17 16:06:45 -0500
commit474fce067521a40dbacc722e8ba119e81c2d31bf (patch)
treefd923aa42a5304182e8a8c64ca5d130f9afef286 /fs/xfs/xfs_inode_item.c
parent49e4c70e52a2bc2090e5a4e003e2888af21d6a2b (diff)
xfs: replace i_flock with a sleeping bitlock
We almost never block on i_flock, the exception is synchronous inode flushing. Instead of bloating the inode with a 16/24-byte completion that we abuse as a semaphore just implement it as a bitlock that uses a bit waitqueue for the rare sleeping path. This primarily is a tradeoff between a much smaller inode and a faster non-blocking path vs faster wakeups, and we are much better off with the former. A small downside is that we will lose lockdep checking for i_flock, but given that it's always taken inside the ilock that should be acceptable. Note that for example the inode writeback locking is implemented in a very similar way. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Alex Elder <aelder@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_inode_item.c')
-rw-r--r--fs/xfs/xfs_inode_item.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c
index 2b6b4fcef49e..c8d4ce0efd5a 100644
--- a/fs/xfs/xfs_inode_item.c
+++ b/fs/xfs/xfs_inode_item.c
@@ -717,7 +717,7 @@ xfs_inode_item_pushbuf(
717 * If a flush is not in progress anymore, chances are that the 717 * If a flush is not in progress anymore, chances are that the
718 * inode was taken off the AIL. So, just get out. 718 * inode was taken off the AIL. So, just get out.
719 */ 719 */
720 if (completion_done(&ip->i_flush) || 720 if (!xfs_isiflocked(ip) ||
721 !(lip->li_flags & XFS_LI_IN_AIL)) { 721 !(lip->li_flags & XFS_LI_IN_AIL)) {
722 xfs_iunlock(ip, XFS_ILOCK_SHARED); 722 xfs_iunlock(ip, XFS_ILOCK_SHARED);
723 return true; 723 return true;
@@ -750,7 +750,7 @@ xfs_inode_item_push(
750 struct xfs_inode *ip = iip->ili_inode; 750 struct xfs_inode *ip = iip->ili_inode;
751 751
752 ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); 752 ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED));
753 ASSERT(!completion_done(&ip->i_flush)); 753 ASSERT(xfs_isiflocked(ip));
754 754
755 /* 755 /*
756 * Since we were able to lock the inode's flush lock and 756 * Since we were able to lock the inode's flush lock and