mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 01:53:29 +02:00
xfs: check directory data block header padding in scrub
Add the missing scrub check for the pad field in directory data block headers. Old kernels may have written non-zero padding without issue, and the write path now self-heals stale padding on modification. Flag non-zero padding as an optimization opportunity (preen) rather than corruption. Add xchk_fblock_set_preen helper for reporting file fork block issues that could be optimized. The trace event xchk_fblock_preen already exists. Signed-off-by: Yuto Ohnuki <ytohnuki@amazon.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
parent
8fbb1877df
commit
939919ccdd
|
|
@ -251,6 +251,17 @@ xchk_ino_set_preen(
|
|||
trace_xchk_ino_preen(sc, ino, __return_address);
|
||||
}
|
||||
|
||||
/* Record a block indexed by a file fork that could be optimized. */
|
||||
void
|
||||
xchk_fblock_set_preen(
|
||||
struct xfs_scrub *sc,
|
||||
int whichfork,
|
||||
xfs_fileoff_t offset)
|
||||
{
|
||||
sc->sm->sm_flags |= XFS_SCRUB_OFLAG_PREEN;
|
||||
trace_xchk_fblock_preen(sc, whichfork, offset, __return_address);
|
||||
}
|
||||
|
||||
/* Record something being wrong with the filesystem primary superblock. */
|
||||
void
|
||||
xchk_set_corrupt(
|
||||
|
|
|
|||
|
|
@ -25,6 +25,8 @@ bool xchk_fblock_xref_process_error(struct xfs_scrub *sc,
|
|||
void xchk_block_set_preen(struct xfs_scrub *sc,
|
||||
struct xfs_buf *bp);
|
||||
void xchk_ino_set_preen(struct xfs_scrub *sc, xfs_ino_t ino);
|
||||
void xchk_fblock_set_preen(struct xfs_scrub *sc,
|
||||
int whichfork, xfs_fileoff_t offset);
|
||||
|
||||
void xchk_set_corrupt(struct xfs_scrub *sc);
|
||||
void xchk_block_set_corrupt(struct xfs_scrub *sc,
|
||||
|
|
|
|||
|
|
@ -492,7 +492,12 @@ xchk_directory_data_bestfree(
|
|||
goto out;
|
||||
xchk_buffer_recheck(sc, bp);
|
||||
|
||||
/* XXX: Check xfs_dir3_data_hdr.pad is zero once we start setting it. */
|
||||
if (xfs_has_crc(sc->mp)) {
|
||||
struct xfs_dir3_data_hdr *hdr3 = bp->b_addr;
|
||||
|
||||
if (hdr3->pad)
|
||||
xchk_fblock_set_preen(sc, XFS_DATA_FORK, lblk);
|
||||
}
|
||||
|
||||
if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
|
||||
goto out_buf;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user