xfs: fix dquot scrub loop cancellation
authorDarrick J. Wong <djwong@kernel.org>
Mon, 22 Mar 2021 16:51:52 +0000 (09:51 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 25 Mar 2021 23:47:49 +0000 (16:47 -0700)
When xchk_quota_item figures out that it needs to terminate the scrub
operation, it needs to return some error code to abort the loop, but
instead it returns zero and the loop keeps running.  Fix this by making
it use ECANCELED, and fix the other loop bailout condition check at the
bottom too.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/scrub/quota.c

index e34ca20ae8e40224ed6887ef62d00e712aa4e672..343f96f48b821c44ac9c9490371b60441d3429ee 100644 (file)
@@ -85,7 +85,7 @@ xchk_quota_item(
        int                     error = 0;
 
        if (xchk_should_terminate(sc, &error))
-               return error;
+               return -ECANCELED;
 
        /*
         * Except for the root dquot, the actual dquot we got must either have
@@ -162,7 +162,7 @@ xchk_quota_item(
 
 out:
        if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
-               return -EFSCORRUPTED;
+               return -ECANCELED;
 
        return 0;
 }
@@ -238,6 +238,8 @@ xchk_quota(
        error = xfs_qm_dqiterate(mp, dqtype, xchk_quota_item, &sqi);
        sc->ilock_flags = XFS_ILOCK_EXCL;
        xfs_ilock(sc->ip, sc->ilock_flags);
+       if (error == -ECANCELED)
+               error = 0;
        if (!xchk_fblock_process_error(sc, XFS_DATA_FORK,
                        sqi.last_id * qi->qi_dqperchunk, &error))
                goto out;