On Tue, Jul 22, 2008 at 04:32:27PM +1000, Lachlan McIlroy wrote:
This changes xfs_inode_item_push() to use XFS_IFLUSH_ASYNC_NOBLOCK when
flushing an inode so the flush wont block on inode cluster buffer lock.
Also change the prototype of the IOP_PUSH operation so that xfsaild_push()
can bump it's stuck count.
This change was prompted by a deadlock that would only occur on a debug
XFS where a thread creating an inode had the buffer locked and was trying
to allocate space for the inode tracing facility. That recursed back into
the filesystem to flush data which created a transaction and needed log
space which wasn't available.
The stuck propagation looks good, but I don't think this should be
blindly done for all errors. The only error where it makes sense is
the EAGAIN from xfs_iflush. All other returns inside the item_push
handlers basically indicate filesystem corruption.