mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
xfs: fix buffer corruption reporting when xfs_dir3_free_header_check fails
commitce99494c96upstream. xfs_verifier_error is supposed to be called on a corrupt metadata buffer from within a buffer verifier function, whereas xfs_buf_mark_corrupt is the function to be called when a piece of code has read a buffer and catches something that a read verifier cannot. The first function sets b_error anticipating that the low level buffer handling code will see the nonzero b_error and clear XBF_DONE on the buffer, whereas the second function does not. Since xfs_dir3_free_header_check examines fields in the dir free block header that require more context than can be provided to read verifiers, we must call xfs_buf_mark_corrupt when it finds a problem. Switching the calls has a secondary effect that we no longer corrupt the buffer state by setting b_error and leaving XBF_DONE set. When /that/ happens, we'll trip over various state assertions (most commonly the b_error check in xfs_buf_reverify) on a subsequent attempt to read the buffer. Fixes:bc1a09b8e3("xfs: refactor verifier callers to print address of failing check") Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Acked-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Chandan Babu R <chandan.babu@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
6e204b9e67
commit
bc013efdcf
@@ -208,7 +208,7 @@ __xfs_dir3_free_read(
|
||||
/* Check things that we can't do in the verifier. */
|
||||
fa = xfs_dir3_free_header_check(dp, fbno, *bpp);
|
||||
if (fa) {
|
||||
xfs_verifier_error(*bpp, -EFSCORRUPTED, fa);
|
||||
__xfs_buf_mark_corrupt(*bpp, fa);
|
||||
xfs_trans_brelse(tp, *bpp);
|
||||
*bpp = NULL;
|
||||
return -EFSCORRUPTED;
|
||||
|
||||
Reference in New Issue
Block a user