xfs: ensure we mark all inodes in a freed cluster XFS_ISTALE
authorDave Chinner <dchinner@redhat.com>
Tue, 24 Aug 2010 01:42:41 +0000 (11:42 +1000)
committerDave Chinner <david@fromorbit.com>
Tue, 24 Aug 2010 01:42:41 +0000 (11:42 +1000)
commit5b3eed756cd37255cad1181bd86bfd0977e97953
tree3d6b178c346d5980dd650336c107abd9d75ee584
parentd17c701ce6a548a92f7f8a3cec20299465f36ee3
xfs: ensure we mark all inodes in a freed cluster XFS_ISTALE

Under heavy load parallel metadata loads (e.g. dbench), we can fail
to mark all the inodes in a cluster being freed as XFS_ISTALE as we
skip inodes we cannot get the XFS_ILOCK_EXCL or the flush lock on.
When this happens and the inode cluster buffer has already been
marked stale and freed, inode reclaim can try to write the inode out
as it is dirty and not marked stale. This can result in writing th
metadata to an freed extent, or in the case it has already
been overwritten trigger a magic number check failure and return an
EUCLEAN error such as:

Filesystem "ram0": inode 0x442ba1 background reclaim flush failed with 117

Fix this by ensuring that we hoover up all in memory inodes in the
cluster and mark them XFS_ISTALE when freeing the cluster.

Cc: <stable@kernel.org>
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/xfs_inode.c