xfs: separate dquot repair into a separate function
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 8 Jan 2018 18:51:24 +0000 (10:51 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 8 Jan 2018 18:54:47 +0000 (10:54 -0800)
Move the dquot repair code into a separate function and remove
XFS_QMOPT_DQREPAIR in favor of calling the helper directly.  Remove
other dead code because quotacheck is the only caller of DQREPAIR.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
fs/xfs/libxfs/xfs_dquot_buf.c
fs/xfs/libxfs/xfs_quota_defs.h
fs/xfs/xfs_dquot.c
fs/xfs/xfs_qm.c

index f8b62fca9f6a033d2aba227f753a0529eb9fbfa1..6b15c50052668e71ddff0f8f136cf426dfa168bc 100644 (file)
@@ -51,7 +51,6 @@ xfs_dqcheck(
        uint             flags,
        const char       *str)
 {
-       xfs_dqblk_t      *d = (xfs_dqblk_t *)ddq;
        int             errs = 0;
 
        /*
@@ -139,17 +138,26 @@ xfs_dqcheck(
                }
        }
 
-       if (!errs || !(flags & XFS_QMOPT_DQREPAIR))
-               return errs;
+       return errs;
+}
+
+/*
+ * Do some primitive error checking on ondisk dquot data structures.
+ */
+int
+xfs_dquot_repair(
+       struct xfs_mount        *mp,
+       struct xfs_disk_dquot   *ddq,
+       xfs_dqid_t              id,
+       uint                    type)
+{
+       struct xfs_dqblk        *d = (struct xfs_dqblk *)ddq;
 
-       if (flags & XFS_QMOPT_DOWARN)
-               xfs_notice(mp, "Re-initializing dquot ID 0x%x", id);
 
        /*
         * Typically, a repair is only requested by quotacheck.
         */
        ASSERT(id != -1);
-       ASSERT(flags & XFS_QMOPT_DQREPAIR);
        memset(d, 0, sizeof(xfs_dqblk_t));
 
        d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC);
@@ -163,7 +171,7 @@ xfs_dqcheck(
                                 XFS_DQUOT_CRC_OFF);
        }
 
-       return errs;
+       return 0;
 }
 
 STATIC bool
index d69c772271cb0d882ceabbc0b5754c94ec4d5367..7187ec93fc7630e00006bce243aadea13abd0317 100644 (file)
@@ -113,7 +113,6 @@ typedef uint16_t    xfs_qwarncnt_t;
 #define XFS_QMOPT_FORCE_RES    0x0000010 /* ignore quota limits */
 #define XFS_QMOPT_SBVERSION    0x0000040 /* change superblock version num */
 #define XFS_QMOPT_DOWARN        0x0000400 /* increase warning cnt if needed */
-#define XFS_QMOPT_DQREPAIR     0x0001000 /* repair dquot if damaged */
 #define XFS_QMOPT_GQUOTA       0x0002000 /* group dquot requested */
 #define XFS_QMOPT_ENOSPC       0x0004000 /* enospc instead of edquot (prj) */
 #define XFS_QMOPT_DQNEXT       0x0008000 /* return next dquot >= this ID */
@@ -156,5 +155,7 @@ typedef uint16_t    xfs_qwarncnt_t;
 extern int xfs_dqcheck(struct xfs_mount *mp, xfs_disk_dquot_t *ddq,
                       xfs_dqid_t id, uint type, uint flags, const char *str);
 extern int xfs_calc_dquots_per_chunk(unsigned int nbblks);
+extern int xfs_dquot_repair(struct xfs_mount *mp, struct xfs_disk_dquot *ddq,
+               xfs_dqid_t id, uint type);
 
 #endif /* __XFS_QUOTA_H__ */
index f248708c10ff7f64e61fb3cde307f42031322424..0d8c52b499f07d1f7cfadd9e523df30d9c8f668a 100644 (file)
@@ -399,52 +399,6 @@ error0:
        return error;
 }
 
-STATIC int
-xfs_qm_dqrepair(
-       struct xfs_mount        *mp,
-       struct xfs_trans        *tp,
-       struct xfs_dquot        *dqp,
-       xfs_dqid_t              firstid,
-       struct xfs_buf          **bpp)
-{
-       int                     error;
-       struct xfs_disk_dquot   *ddq;
-       struct xfs_dqblk        *d;
-       int                     i;
-
-       /*
-        * Read the buffer without verification so we get the corrupted
-        * buffer returned to us. make sure we verify it on write, though.
-        */
-       error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, dqp->q_blkno,
-                                  mp->m_quotainfo->qi_dqchunklen,
-                                  0, bpp, NULL);
-
-       if (error) {
-               ASSERT(*bpp == NULL);
-               return error;
-       }
-       (*bpp)->b_ops = &xfs_dquot_buf_ops;
-
-       ASSERT(xfs_buf_islocked(*bpp));
-       d = (struct xfs_dqblk *)(*bpp)->b_addr;
-
-       /* Do the actual repair of dquots in this buffer */
-       for (i = 0; i < mp->m_quotainfo->qi_dqperchunk; i++) {
-               ddq = &d[i].dd_diskdq;
-               error = xfs_dqcheck(mp, ddq, firstid + i,
-                                      dqp->dq_flags & XFS_DQ_ALLTYPES,
-                                      XFS_QMOPT_DQREPAIR, "xfs_qm_dqrepair");
-               if (error) {
-                       /* repair failed, we're screwed */
-                       xfs_trans_brelse(tp, *bpp);
-                       return -EIO;
-               }
-       }
-
-       return 0;
-}
-
 /*
  * Maps a dquot to the buffer containing its on-disk version.
  * This returns a ptr to the buffer containing the on-disk dquot
@@ -526,14 +480,6 @@ xfs_qm_dqtobp(
                                           dqp->q_blkno,
                                           mp->m_quotainfo->qi_dqchunklen,
                                           0, &bp, &xfs_dquot_buf_ops);
-
-               if (error == -EFSCORRUPTED && (flags & XFS_QMOPT_DQREPAIR)) {
-                       xfs_dqid_t firstid = (xfs_dqid_t)map.br_startoff *
-                                               mp->m_quotainfo->qi_dqperchunk;
-                       ASSERT(bp == NULL);
-                       error = xfs_qm_dqrepair(mp, tp, dqp, firstid, &bp);
-               }
-
                if (error) {
                        ASSERT(bp == NULL);
                        return error;
index b897b11afb2c658bebba0416739fddcc0fec5aa4..65d34cc35b92876e9f1ee9acb10c1ebf0eddc945 100644 (file)
@@ -843,6 +843,7 @@ xfs_qm_reset_dqcounts(
 {
        struct xfs_dqblk        *dqb;
        int                     j;
+       int                     error;
 
        trace_xfs_reset_dqcounts(bp, _RET_IP_);
 
@@ -866,8 +867,10 @@ xfs_qm_reset_dqcounts(
                 * output any warnings because it's perfectly possible to
                 * find uninitialised dquot blks. See comment in xfs_dqcheck.
                 */
-               xfs_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR,
-                           "xfs_quotacheck");
+               error = xfs_dqcheck(mp, ddq, id+j, type, 0, "xfs_quotacheck");
+               if (error)
+                       xfs_dquot_repair(mp, ddq, id + j, type);
+
                /*
                 * Reset type in case we are reusing group quota file for
                 * project quotas or vice versa