xfs: inode buffers may not be valid during recovery readahead
authorDave Chinner <dchinner@redhat.com>
Tue, 27 Aug 2013 01:39:37 +0000 (11:39 +1000)
committerBen Myers <bpm@sgi.com>
Fri, 30 Aug 2013 18:45:49 +0000 (13:45 -0500)
commitd8914002a0391331a88d9f5de4a235220735d4cc
tree4fbdcc1bae11941554c98651985878cf1e47ad36
parent50d5c8d8e938e3c4c0d21db9fc7d64282dc7be20
xfs: inode buffers may not be valid during recovery readahead

CRC enabled filesystems fail log recovery with 100% reliability on
xfstests xfs/085 with the following failure:

XFS (vdb): Mounting Filesystem
XFS (vdb): Starting recovery (logdev: internal)
XFS (vdb): Corruption detected. Unmount and run xfs_repair
XFS (vdb): bad inode magic/vsn daddr 144 #0 (magic=0)
XFS: Assertion failed: 0, file: fs/xfs/xfs_inode_buf.c, line: 95

The problem is that the inode buffer has not been recovered before
the readahead on the inode buffer is issued. The checkpoint being
recovered actually allocates the inode chunk we are doing readahead
from, so what comes from disk during readahead is essentially
random and the verifier barfs on it.

This inode buffer readahead problem affects non-crc filesystems,
too, but xfstests does not trigger it at all on such
configurations....

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
fs/xfs/xfs_inode_buf.c
fs/xfs/xfs_inode_buf.h
fs/xfs/xfs_log_recover.c