xfs: flag inode corruption if parent ptr doesn't get us a real inode
If a directory's parent inode pointer doesn't point to an inode, the directory should be flagged as corrupt. Enable IGET_UNTRUSTED here so that _iget will return -EINVAL if the inobt does not confirm that the inode is present and allocated and we can flag the directory corruption. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com>
This commit is contained in:
parent
6a96c56505
commit
5927268f5a
|
@ -167,8 +167,18 @@ xfs_scrub_parent_validate(
|
||||||
* if the parent pointer erroneously points to a file, we
|
* if the parent pointer erroneously points to a file, we
|
||||||
* can't use DONTCACHE here because DONTCACHE inodes can trigger
|
* can't use DONTCACHE here because DONTCACHE inodes can trigger
|
||||||
* immediate inactive cleanup of the inode.
|
* immediate inactive cleanup of the inode.
|
||||||
|
*
|
||||||
|
* If _iget returns -EINVAL then the parent inode number is garbage
|
||||||
|
* and the directory is corrupt. If the _iget returns -EFSCORRUPTED
|
||||||
|
* or -EFSBADCRC then the parent is corrupt which is a cross
|
||||||
|
* referencing error. Any other error is an operational error.
|
||||||
*/
|
*/
|
||||||
error = xfs_iget(mp, sc->tp, dnum, 0, 0, &dp);
|
error = xfs_iget(mp, sc->tp, dnum, XFS_IGET_UNTRUSTED, 0, &dp);
|
||||||
|
if (error == -EINVAL) {
|
||||||
|
error = -EFSCORRUPTED;
|
||||||
|
xfs_scrub_fblock_process_error(sc, XFS_DATA_FORK, 0, &error);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
if (!xfs_scrub_fblock_xref_process_error(sc, XFS_DATA_FORK, 0, &error))
|
if (!xfs_scrub_fblock_xref_process_error(sc, XFS_DATA_FORK, 0, &error))
|
||||||
goto out;
|
goto out;
|
||||||
if (dp == sc->ip || !S_ISDIR(VFS_I(dp)->i_mode)) {
|
if (dp == sc->ip || !S_ISDIR(VFS_I(dp)->i_mode)) {
|
||||||
|
|
Loading…
Reference in New Issue