xfs: catch a few more error codes when scrubbing secondary sb
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 8 Jan 2018 18:49:02 +0000 (10:49 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 8 Jan 2018 18:49:02 +0000 (10:49 -0800)
The superblock validation routines return a variety of error codes to
reject a mount request.  For scrub we can assume that the mount
succeeded, so if we see these things appear when scrubbing secondary sb
X, we can treat them all like corruption.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
fs/xfs/scrub/agheader.c

index b599358c379659d4d832cf3cd7e5407ae8f1a60c..97beb47732981017949e97d5bb6b1f80b5f3740e 100644 (file)
@@ -126,6 +126,22 @@ xfs_scrub_superblock(
        error = xfs_trans_read_buf(mp, sc->tp, mp->m_ddev_targp,
                  XFS_AGB_TO_DADDR(mp, agno, XFS_SB_BLOCK(mp)),
                  XFS_FSS_TO_BB(mp, 1), 0, &bp, &xfs_sb_buf_ops);
+       /*
+        * The superblock verifier can return several different error codes
+        * if it thinks the superblock doesn't look right.  For a mount these
+        * would all get bounced back to userspace, but if we're here then the
+        * fs mounted successfully, which means that this secondary superblock
+        * is simply incorrect.  Treat all these codes the same way we treat
+        * any corruption.
+        */
+       switch (error) {
+       case -EINVAL:   /* also -EWRONGFS */
+       case -ENOSYS:
+       case -EFBIG:
+               error = -EFSCORRUPTED;
+       default:
+               break;
+       }
        if (!xfs_scrub_process_error(sc, agno, XFS_SB_BLOCK(mp), &error))
                return error;