mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 03:27:30 -04:00
xfs: fully check the parent handle when it points to the rootdir
LOLLM noticed that the directory tree path checking declares the path to
be ok if the inumber in the parent pointer reaches the root directory.
Unfortunately, it neglects to check that the generation is correct. Fix
that by moving the generation check up.
Cc: stable@vger.kernel.org # v6.10
Fixes: 928b721a11 ("xfs: teach online scrub to find directory tree structure problems")
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Assisted-by: LOLLM # finding obvious bugs
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
committed by
Carlos Maiolino
parent
353a5900bc
commit
ba150ce634
@@ -383,6 +383,14 @@ xchk_dirpath_step_up(
|
||||
goto out_scanlock;
|
||||
}
|
||||
|
||||
/* The handle encoded in the parent pointer must match. */
|
||||
if (VFS_I(dp)->i_generation != be32_to_cpu(dl->pptr_rec.p_gen)) {
|
||||
trace_xchk_dirpath_badgen(dl->sc, dp, path->path_nr,
|
||||
path->nr_steps, &dl->xname, &dl->pptr_rec);
|
||||
error = -EFSCORRUPTED;
|
||||
goto out_scanlock;
|
||||
}
|
||||
|
||||
/* We've reached the root directory; the path is ok. */
|
||||
if (parent_ino == dl->root_ino) {
|
||||
xchk_dirpath_set_outcome(dl, path, XCHK_DIRPATH_OK);
|
||||
@@ -411,14 +419,6 @@ xchk_dirpath_step_up(
|
||||
goto out_scanlock;
|
||||
}
|
||||
|
||||
/* The handle encoded in the parent pointer must match. */
|
||||
if (VFS_I(dp)->i_generation != be32_to_cpu(dl->pptr_rec.p_gen)) {
|
||||
trace_xchk_dirpath_badgen(dl->sc, dp, path->path_nr,
|
||||
path->nr_steps, &dl->xname, &dl->pptr_rec);
|
||||
error = -EFSCORRUPTED;
|
||||
goto out_scanlock;
|
||||
}
|
||||
|
||||
/* Parent pointer must point up to a directory. */
|
||||
if (!S_ISDIR(VFS_I(dp)->i_mode)) {
|
||||
trace_xchk_dirpath_nondir_parent(dl->sc, dp, path->path_nr,
|
||||
|
||||
Reference in New Issue
Block a user