OSDN Git Service

xfs: convert quotacheck to use the new iwalk functions
authorDarrick J. Wong <darrick.wong@oracle.com>
Tue, 2 Jul 2019 16:39:39 +0000 (09:39 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 2 Jul 2019 16:40:05 +0000 (09:40 -0700)
Convert quotacheck to use the new iwalk iterator to dig through the
inodes.

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

index 71c5d7b..588e36f 100644 (file)
@@ -13,7 +13,7 @@
 #include "xfs_sb.h"
 #include "xfs_mount.h"
 #include "xfs_inode.h"
-#include "xfs_itable.h"
+#include "xfs_iwalk.h"
 #include "xfs_quota.h"
 #include "xfs_bmap.h"
 #include "xfs_bmap_util.h"
@@ -1114,17 +1114,15 @@ xfs_qm_quotacheck_dqadjust(
 /* ARGSUSED */
 STATIC int
 xfs_qm_dqusage_adjust(
-       xfs_mount_t     *mp,            /* mount point for filesystem */
-       xfs_ino_t       ino,            /* inode number to get data for */
-       void            __user *buffer, /* not used */
-       int             ubsize,         /* not used */
-       int             *ubused,        /* not used */
-       int             *res)           /* result code value */
+       struct xfs_mount        *mp,
+       struct xfs_trans        *tp,
+       xfs_ino_t               ino,
+       void                    *data)
 {
-       xfs_inode_t     *ip;
-       xfs_qcnt_t      nblks;
-       xfs_filblks_t   rtblks = 0;     /* total rt blks */
-       int             error;
+       struct xfs_inode        *ip;
+       xfs_qcnt_t              nblks;
+       xfs_filblks_t           rtblks = 0;     /* total rt blks */
+       int                     error;
 
        ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 
@@ -1132,20 +1130,18 @@ xfs_qm_dqusage_adjust(
         * rootino must have its resources accounted for, not so with the quota
         * inodes.
         */
-       if (xfs_is_quota_inode(&mp->m_sb, ino)) {
-               *res = BULKSTAT_RV_NOTHING;
-               return -EINVAL;
-       }
+       if (xfs_is_quota_inode(&mp->m_sb, ino))
+               return 0;
 
        /*
         * We don't _need_ to take the ilock EXCL here because quotacheck runs
         * at mount time and therefore nobody will be racing chown/chproj.
         */
-       error = xfs_iget(mp, NULL, ino, XFS_IGET_DONTCACHE, 0, &ip);
-       if (error) {
-               *res = BULKSTAT_RV_NOTHING;
+       error = xfs_iget(mp, tp, ino, XFS_IGET_DONTCACHE, 0, &ip);
+       if (error == -EINVAL || error == -ENOENT)
+               return 0;
+       if (error)
                return error;
-       }
 
        ASSERT(ip->i_delayed_blks == 0);
 
@@ -1153,7 +1149,7 @@ xfs_qm_dqusage_adjust(
                struct xfs_ifork        *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
 
                if (!(ifp->if_flags & XFS_IFEXTENTS)) {
-                       error = xfs_iread_extents(NULL, ip, XFS_DATA_FORK);
+                       error = xfs_iread_extents(tp, ip, XFS_DATA_FORK);
                        if (error)
                                goto error0;
                }
@@ -1196,13 +1192,8 @@ xfs_qm_dqusage_adjust(
                        goto error0;
        }
 
-       xfs_irele(ip);
-       *res = BULKSTAT_RV_DIDONE;
-       return 0;
-
 error0:
        xfs_irele(ip);
-       *res = BULKSTAT_RV_GIVEUP;
        return error;
 }
 
@@ -1266,18 +1257,13 @@ STATIC int
 xfs_qm_quotacheck(
        xfs_mount_t     *mp)
 {
-       int                     done, count, error, error2;
-       xfs_ino_t               lastino;
-       size_t                  structsz;
+       int                     error, error2;
        uint                    flags;
        LIST_HEAD               (buffer_list);
        struct xfs_inode        *uip = mp->m_quotainfo->qi_uquotaip;
        struct xfs_inode        *gip = mp->m_quotainfo->qi_gquotaip;
        struct xfs_inode        *pip = mp->m_quotainfo->qi_pquotaip;
 
-       count = INT_MAX;
-       structsz = 1;
-       lastino = 0;
        flags = 0;
 
        ASSERT(uip || gip || pip);
@@ -1314,18 +1300,9 @@ xfs_qm_quotacheck(
                flags |= XFS_PQUOTA_CHKD;
        }
 
-       do {
-               /*
-                * Iterate thru all the inodes in the file system,
-                * adjusting the corresponding dquot counters in core.
-                */
-               error = xfs_bulkstat(mp, &lastino, &count,
-                                    xfs_qm_dqusage_adjust,
-                                    structsz, NULL, &done);
-               if (error)
-                       break;
-
-       } while (!done);
+       error = xfs_iwalk(mp, NULL, 0, xfs_qm_dqusage_adjust, 0, NULL);
+       if (error)
+               goto error_return;
 
        /*
         * We've made all the changes that we need to make incore.  Flush them