This is a note to let you know that I've just added the patch titled xfs: handle -EFSCORRUPTED during head/tail verification to the 4.13-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: xfs-handle-efscorrupted-during-head-tail-verification.patch and it can be found in the queue-4.13 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. >From foo@baz Mon Sep 18 10:25:08 CEST 2017 From: Christoph Hellwig <hch@xxxxxx> Date: Sun, 17 Sep 2017 14:06:14 -0700 Subject: xfs: handle -EFSCORRUPTED during head/tail verification To: stable@xxxxxxxxxxxxxxx Cc: linux-xfs@xxxxxxxxxxxxxxx, Brian Foster <bfoster@xxxxxxxxxx>, "Darrick J . Wong" <darrick.wong@xxxxxxxxxx> Message-ID: <20170917210631.10725-9-hch@xxxxxx> From: Brian Foster <bfoster@xxxxxxxxxx> commit a4c9b34d6a17081005ec459b57b8effc08f4c731 upstream. Torn write and tail overwrite detection both trigger only on -EFSBADCRC errors. While this is the most likely failure scenario for each condition, -EFSCORRUPTED is still possible in certain cases depending on what ends up on disk when a torn write or partial tail overwrite occurs. For example, an invalid log record h_len can lead to an -EFSCORRUPTED error when running the log recovery CRC pass. Therefore, update log head and tail verification to trigger the associated head/tail fixups in the event of -EFSCORRUPTED errors along with -EFSBADCRC. Also, -EFSCORRUPTED can currently be returned from xlog_do_recovery_pass() before rhead_blk is initialized if the first record encountered happens to be corrupted. This leads to an incorrect 'first_bad' return value. Initialize rhead_blk earlier in the function to address that problem as well. Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx> Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- fs/xfs/xfs_log_recover.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1102,7 +1102,7 @@ xlog_verify_tail( first_bad = 0; error = xlog_do_recovery_pass(log, head_blk, *tail_blk, XLOG_RECOVER_CRCPASS, &first_bad); - while (error == -EFSBADCRC && first_bad) { + while ((error == -EFSBADCRC || error == -EFSCORRUPTED) && first_bad) { int tail_distance; /* @@ -1188,7 +1188,7 @@ xlog_verify_head( */ error = xlog_do_recovery_pass(log, *head_blk, tmp_rhead_blk, XLOG_RECOVER_CRCPASS, &first_bad); - if (error == -EFSBADCRC) { + if ((error == -EFSBADCRC || error == -EFSCORRUPTED) && first_bad) { /* * We've hit a potential torn write. Reset the error and warn * about it. @@ -5257,7 +5257,7 @@ xlog_do_recovery_pass( LIST_HEAD (buffer_list); ASSERT(head_blk != tail_blk); - rhead_blk = 0; + blk_no = rhead_blk = tail_blk; for (i = 0; i < XLOG_RHASH_SIZE; i++) INIT_HLIST_HEAD(&rhash[i]); @@ -5335,7 +5335,6 @@ xlog_do_recovery_pass( } memset(rhash, 0, sizeof(rhash)); - blk_no = rhead_blk = tail_blk; if (tail_blk > head_blk) { /* * Perform recovery around the end of the physical log. Patches currently in stable-queue which might be from hch@xxxxxx are queue-4.13/xfs-open-code-xfs_buf_item_dirty.patch queue-4.13/xfs-properly-retry-failed-inode-items-in-case-of-error-during-buffer-writeback.patch queue-4.13/xfs-use-kmem_free-to-free-return-value-of-kmem_zalloc.patch queue-4.13/xfs-add-infrastructure-needed-for-error-propagation-during-buffer-io-failure.patch queue-4.13/xfs-don-t-set-v3-xflags-for-v2-inodes.patch queue-4.13/xfs-toggle-readonly-state-around-xfs_log_mount_finish.patch queue-4.13/xfs-fix-log-recovery-corruption-error-due-to-tail-overwrite.patch queue-4.13/xfs-move-bmbt-owner-change-to-last-step-of-extent-swap.patch queue-4.13/xfs-check-for-race-with-xfs_reclaim_inode-in-xfs_ifree_cluster.patch queue-4.13/xfs-always-verify-the-log-tail-during-recovery.patch queue-4.13/xfs-open-code-end_buffer_async_write-in-xfs_finish_page_writeback.patch queue-4.13/xfs-relog-dirty-buffers-during-swapext-bmbt-owner-change.patch queue-4.13/xfs-disable-per-inode-dax-flag.patch queue-4.13/xfs-refactor-buffer-logging-into-buffer-dirtying-helper.patch queue-4.13/xfs-fix-recovery-failure-when-log-record-header-wraps-log-end.patch queue-4.13/xfs-skip-bmbt-block-ino-validation-during-owner-change.patch queue-4.13/xfs-don-t-log-dirty-ranges-for-ordered-buffers.patch queue-4.13/xfs-stop-searching-for-free-slots-in-an-inode-chunk-when-there-are-none.patch queue-4.13/xfs-fix-incorrect-log_flushed-on-fsync.patch queue-4.13/xfs-evict-all-inodes-involved-with-log-redo-item.patch queue-4.13/xfs-write-unmount-record-for-ro-mounts.patch queue-4.13/xfs-remove-unnecessary-dirty-bli-format-check-for-ordered-bufs.patch queue-4.13/xfs-disallow-marking-previously-dirty-buffers-as-ordered.patch queue-4.13/xfs-handle-efscorrupted-during-head-tail-verification.patch queue-4.13/xfs-ordered-buffer-log-items-are-never-formatted.patch