xfs: fix parent pointer scrubber bailing out on unallocated inodes
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 2 Dec 2020 20:25:44 +0000 (12:25 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 9 Dec 2020 17:49:38 +0000 (09:49 -0800)
xfs_iget can return -ENOENT for a file that the inobt thinks is
allocated but has zeroed mode.  This currently causes scrub to exit
with an operational error instead of flagging this as a corruption.  The
end result is that scrub mistakenly reports the ENOENT to the user
instead of "directory parent pointer corrupt" like we do for EINVAL.

Fixes: 5927268f5a04 ("xfs: flag inode corruption if parent ptr doesn't get us a real inode")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/scrub/parent.c

index 855aa8bcab64bdf829e976ff5559009bc544974a..66c35f6dfc24a0f68e785378a6d05b0232e13fec 100644 (file)
@@ -164,13 +164,13 @@ xchk_parent_validate(
         * can't use DONTCACHE here because DONTCACHE inodes can trigger
         * 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.
+        * If _iget returns -EINVAL or -ENOENT 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, XFS_IGET_UNTRUSTED, 0, &dp);
-       if (error == -EINVAL) {
+       if (error == -EINVAL || error == -ENOENT) {
                error = -EFSCORRUPTED;
                xchk_fblock_process_error(sc, XFS_DATA_FORK, 0, &error);
                goto out;