linux/fs/xfs/linux-2.6
Christoph Hellwig bc990f5cb4 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>
2009-08-17 01:23:48 -05:00
..
kmem.c Fix congestion_wait() sync/async vs read/write confusion 2009-07-10 20:31:53 +02:00
kmem.h xfs: prevent deadlock in xfs_qm_shake() 2009-06-01 22:59:45 -05:00
mrlock.h
sv.h
time.h
xfs_acl.c switch xfs to generic acl caching helpers 2009-06-24 08:17:07 -04:00
xfs_aops.c xfs: bump up nr_to_write in xfs_vm_writepage 2009-07-31 00:57:11 -05:00
xfs_aops.h xfs: prevent unwritten extent conversion from blocking I/O completion 2009-04-06 18:42:11 +02:00
xfs_buf.c Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs 2009-08-12 08:49:35 -07:00
xfs_buf.h
xfs_cred.h
xfs_dmapi_priv.h
xfs_export.c
xfs_export.h
xfs_file.c headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
xfs_fs_subr.c xfs: use xfs_sync_inodes() for device flushing 2009-04-06 18:44:54 +02:00
xfs_fs_subr.h
xfs_globals.c
xfs_globals.h
xfs_ioctl.c Merge branch 'master' of git://git.kernel.org/pub/scm/fs/xfs/xfs 2009-06-11 16:56:49 -05:00
xfs_ioctl.h
xfs_ioctl32.c xfs: use memdup_user() 2009-04-20 23:02:51 -04:00
xfs_ioctl32.h
xfs_iops.c xfs: reduce bmv_count in xfs_vn_fiemap 2009-07-31 00:56:58 -05:00
xfs_iops.h
xfs_linux.h block: rename CONFIG_LBD to CONFIG_LBDAF 2009-06-19 08:08:50 +02:00
xfs_lrw.c xfs: use generic Posix ACL code 2009-06-10 17:07:47 +02:00
xfs_lrw.h
xfs_quotaops.c xfs: split xfs_sync_inodes 2009-06-08 15:35:48 +02:00
xfs_stats.c
xfs_stats.h
xfs_super.c block: rename CONFIG_LBD to CONFIG_LBDAF 2009-06-19 08:08:50 +02:00
xfs_super.h
xfs_sync.c xfs: fix locking in xfs_iget_cache_hit 2009-08-17 01:23:48 -05:00
xfs_sync.h xfs: fix locking in xfs_iget_cache_hit 2009-08-17 01:23:48 -05:00
xfs_sysctl.c
xfs_sysctl.h
xfs_version.h
xfs_vnode.h
xfs_xattr.c xfs: use generic Posix ACL code 2009-06-10 17:07:47 +02:00