xfs: fix locking in xfs_iget_cache_hit
authorChristoph Hellwig <hch@infradead.org>
Mon, 17 Aug 2009 00:36:34 +0000 (20:36 -0400)
committerFelix Blyakher <felixb@sgi.com>
Tue, 18 Aug 2009 05:57:14 +0000 (00:57 -0500)
commita022fe09700365c51d1f55884bca9754eb96a802
treef70d3ed8662bfd576f58f3382b5a119a8df32433
parent79dd43bb85d64ba14a781f940c858d7bbe8c9a6d
xfs: fix locking in xfs_iget_cache_hit

The locking in xfs_iget_cache_hit currently has numerous problems:

 - we clear the reclaim tag without i_flags_lock which protects
   modifications to it
 - we call inode_init_always which can sleep with pag_ici_lock
   held (this is oss.sgi.com BZ #819)
 - we acquire and drop i_flags_lock a lot and thus provide no
   consistency between the various flags we set/clear under it

This patch fixes all that with a major revamp of the locking in
the function.  The new version acquires i_flags_lock early and
only drops it once we need to call into inode_init_always or before
calling xfs_ilock.

This patch fixes a bug seen in the wild where we race modifying the
reclaim tag.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Felix Blyakher <felixb@sgi.com>
Reviewed-by: Eric Sandeen <sandeen@sandeen.net>
Signed-off-by: Felix Blyakher <felixb@sgi.com>
fs/xfs/linux-2.6/xfs_sync.c
fs/xfs/linux-2.6/xfs_sync.h
fs/xfs/xfs_iget.c