Skip to content

Commit d302cf1

Browse files
Dave ChinnerBen Myers
authored andcommitted
xfs: don't shutdown log recovery on validation errors
Unfortunately, we cannot guarantee that items logged multiple times and replayed by log recovery do not take objects back in time. When they are taken back in time, the go into an intermediate state which is corrupt, and hence verification that occurs on this intermediate state causes log recovery to abort with a corruption shutdown. Instead of causing a shutdown and unmountable filesystem, don't verify post-recovery items before they are written to disk. This is less than optimal, but there is no way to detect this issue for non-CRC filesystems If log recovery successfully completes, this will be undone and the object will be consistent by subsequent transactions that are replayed, so in most cases we don't need to take drastic action. For CRC enabled filesystems, leave the verifiers in place - we need to call them to recalculate the CRCs on the objects anyway. This recovery problem can be solved for such filesystems - we have a LSN stamped in all metadata at writeback time that we can to determine whether the item should be replayed or not. This is a separate piece of work, so is not addressed by this patch. Signed-off-by: Dave Chinner <[email protected]> Reviewed-by: Ben Myers <[email protected]> Signed-off-by: Ben Myers <[email protected]> (cherry picked from commit 9222a9c)
1 parent 088c9f6 commit d302cf1

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

fs/xfs/xfs_log_recover.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1845,7 +1845,13 @@ xlog_recover_do_inode_buffer(
18451845
xfs_agino_t *buffer_nextp;
18461846

18471847
trace_xfs_log_recover_buf_inode_buf(mp->m_log, buf_f);
1848-
bp->b_ops = &xfs_inode_buf_ops;
1848+
1849+
/*
1850+
* Post recovery validation only works properly on CRC enabled
1851+
* filesystems.
1852+
*/
1853+
if (xfs_sb_version_hascrc(&mp->m_sb))
1854+
bp->b_ops = &xfs_inode_buf_ops;
18491855

18501856
inodes_per_buf = BBTOB(bp->b_io_length) >> mp->m_sb.sb_inodelog;
18511857
for (i = 0; i < inodes_per_buf; i++) {
@@ -2205,7 +2211,16 @@ xlog_recover_do_reg_buffer(
22052211
/* Shouldn't be any more regions */
22062212
ASSERT(i == item->ri_total);
22072213

2208-
xlog_recovery_validate_buf_type(mp, bp, buf_f);
2214+
/*
2215+
* We can only do post recovery validation on items on CRC enabled
2216+
* fielsystems as we need to know when the buffer was written to be able
2217+
* to determine if we should have replayed the item. If we replay old
2218+
* metadata over a newer buffer, then it will enter a temporarily
2219+
* inconsistent state resulting in verification failures. Hence for now
2220+
* just avoid the verification stage for non-crc filesystems
2221+
*/
2222+
if (xfs_sb_version_hascrc(&mp->m_sb))
2223+
xlog_recovery_validate_buf_type(mp, bp, buf_f);
22092224
}
22102225

22112226
/*

0 commit comments

Comments
 (0)