xfs: replace i_flock with a sleeping bitlock
authorChristoph Hellwig <hch@infradead.org>
Sun, 18 Dec 2011 20:00:09 +0000 (20:00 +0000)
committerBen Myers <bpm@sgi.com>
Tue, 17 Jan 2012 21:06:45 +0000 (15:06 -0600)
commit474fce067521a40dbacc722e8ba119e81c2d31bf
treefd923aa42a5304182e8a8c64ca5d130f9afef286
parent49e4c70e52a2bc2090e5a4e003e2888af21d6a2b
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>
fs/xfs/xfs_iget.c
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.h
fs/xfs/xfs_inode_item.c
fs/xfs/xfs_super.c
fs/xfs/xfs_sync.c