xfs: remove XLOG_STATE_IOABORT
This value is the only flag in ic_state, which we otherwise use as a state. Switch it to a new debug-only field and also report and actual error in the buffer in the I/O completion path. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
9bff313253
commit
366fc4b898
@ -1257,16 +1257,16 @@ xlog_iodone(xfs_buf_t *bp)
|
||||
struct xlog *l = iclog->ic_log;
|
||||
int aborted = 0;
|
||||
|
||||
/*
|
||||
* Race to shutdown the filesystem if we see an error or the iclog is in
|
||||
* IOABORT state. The IOABORT state is only set in DEBUG mode to inject
|
||||
* CRC errors into log recovery.
|
||||
*/
|
||||
if (XFS_TEST_ERROR(bp->b_error, l->l_mp, XFS_ERRTAG_IODONE_IOERR) ||
|
||||
iclog->ic_state & XLOG_STATE_IOABORT) {
|
||||
if (iclog->ic_state & XLOG_STATE_IOABORT)
|
||||
iclog->ic_state &= ~XLOG_STATE_IOABORT;
|
||||
#ifdef DEBUG
|
||||
/* treat writes with injected CRC errors as failed */
|
||||
if (iclog->ic_fail_crc)
|
||||
bp->b_error = -EIO;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Race to shutdown the filesystem if we see an error.
|
||||
*/
|
||||
if (XFS_TEST_ERROR(bp->b_error, l->l_mp, XFS_ERRTAG_IODONE_IOERR)) {
|
||||
xfs_buf_ioerror_alert(bp, __func__);
|
||||
xfs_buf_stale(bp);
|
||||
xfs_force_shutdown(l->l_mp, SHUTDOWN_LOG_IO_ERROR);
|
||||
@ -1881,13 +1881,15 @@ xlog_sync(
|
||||
* write on I/O completion and shutdown the fs. The subsequent mount
|
||||
* detects the bad CRC and attempts to recover.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
if (XFS_TEST_ERROR(false, log->l_mp, XFS_ERRTAG_LOG_BAD_CRC)) {
|
||||
iclog->ic_header.h_crc &= cpu_to_le32(0xAAAAAAAA);
|
||||
iclog->ic_state |= XLOG_STATE_IOABORT;
|
||||
iclog->ic_fail_crc = true;
|
||||
xfs_warn(log->l_mp,
|
||||
"Intentionally corrupted log record at LSN 0x%llx. Shutdown imminent.",
|
||||
be64_to_cpu(iclog->ic_header.h_lsn));
|
||||
}
|
||||
#endif
|
||||
|
||||
bp->b_io_length = BTOBB(count);
|
||||
bp->b_log_item = iclog;
|
||||
|
@ -50,7 +50,6 @@ static inline uint xlog_get_client_id(__be32 i)
|
||||
#define XLOG_STATE_CALLBACK 0x0020 /* Callback functions now */
|
||||
#define XLOG_STATE_DIRTY 0x0040 /* Dirty IC log, not ready for ACTIVE status*/
|
||||
#define XLOG_STATE_IOERROR 0x0080 /* IO error happened in sync'ing log */
|
||||
#define XLOG_STATE_IOABORT 0x0100 /* force abort on I/O completion (debug) */
|
||||
#define XLOG_STATE_ALL 0x7FFF /* All possible valid flags */
|
||||
#define XLOG_STATE_NOTUSED 0x8000 /* This IC log not being used */
|
||||
|
||||
@ -223,6 +222,9 @@ typedef struct xlog_in_core {
|
||||
atomic_t ic_refcnt ____cacheline_aligned_in_smp;
|
||||
xlog_in_core_2_t *ic_data;
|
||||
#define ic_header ic_data->hic_header
|
||||
#ifdef DEBUG
|
||||
bool ic_fail_crc : 1;
|
||||
#endif
|
||||
} xlog_in_core_t;
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user