]> www.infradead.org Git - users/hch/misc.git/commitdiff
xfs: convert quotacheck to attach dquot buffers
authorDarrick J. Wong <djwong@kernel.org>
Mon, 2 Dec 2024 18:57:39 +0000 (10:57 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Fri, 13 Dec 2024 01:45:12 +0000 (17:45 -0800)
Now that we've converted the dquot logging machinery to attach the dquot
buffer to the li_buf pointer so that the AIL dqflush doesn't have to
allocate or read buffers in a reclaim path, do the same for the
quotacheck code so that the reclaim shrinker dqflush call doesn't have
to do that either.

Cc: <stable@vger.kernel.org> # v6.12
Fixes: 903edea6c53f09 ("mm: warn about illegal __GFP_NOFAIL usage in a more appropriate location and manner")
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/xfs_dquot.c
fs/xfs/xfs_dquot.h
fs/xfs/xfs_qm.c

index 708fd3358375fe24c28dc039adb5607ce6d9cc3c..f11d475898f280e41a5187c715881266ee516de9 100644 (file)
@@ -1285,11 +1285,10 @@ xfs_qm_dqflush_check(
  * Requires dquot flush lock, will clear the dirty flag, delete the quota log
  * item from the AIL, and shut down the system if something goes wrong.
  */
-int
+static int
 xfs_dquot_read_buf(
        struct xfs_trans        *tp,
        struct xfs_dquot        *dqp,
-       xfs_buf_flags_t         xbf_flags,
        struct xfs_buf          **bpp)
 {
        struct xfs_mount        *mp = dqp->q_mount;
@@ -1297,10 +1296,8 @@ xfs_dquot_read_buf(
        int                     error;
 
        error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, dqp->q_blkno,
-                                  mp->m_quotainfo->qi_dqchunklen, xbf_flags,
+                                  mp->m_quotainfo->qi_dqchunklen, 0,
                                   &bp, &xfs_dquot_buf_ops);
-       if (error == -EAGAIN)
-               return error;
        if (xfs_metadata_is_sick(error))
                xfs_dquot_mark_sick(dqp);
        if (error)
@@ -1334,7 +1331,7 @@ xfs_dquot_attach_buf(
                struct xfs_buf  *bp = NULL;
 
                spin_unlock(&qlip->qli_lock);
-               error = xfs_dquot_read_buf(tp, dqp, 0, &bp);
+               error = xfs_dquot_read_buf(tp, dqp, &bp);
                if (error)
                        return error;
 
index c7e80fc9082381509704d7c435c7d865eea1a4ca..c617bac75361b2d095066d15de8718b56aa868a8 100644 (file)
@@ -214,8 +214,6 @@ void xfs_dquot_to_disk(struct xfs_disk_dquot *ddqp, struct xfs_dquot *dqp);
 #define XFS_DQ_IS_DIRTY(dqp)   ((dqp)->q_flags & XFS_DQFLAG_DIRTY)
 
 void           xfs_qm_dqdestroy(struct xfs_dquot *dqp);
-int            xfs_dquot_read_buf(struct xfs_trans *tp, struct xfs_dquot *dqp,
-                               xfs_buf_flags_t flags, struct xfs_buf **bpp);
 int            xfs_qm_dqflush(struct xfs_dquot *dqp, struct xfs_buf *bp);
 void           xfs_qm_dqunpin_wait(struct xfs_dquot *dqp);
 void           xfs_qm_adjust_dqtimers(struct xfs_dquot *d);
index 7d07d4b5c3398fe131ddc4a7a94fa1d3a4587c92..69b70c3e999d7241e8db5b2b4466fc2695ea498e 100644 (file)
@@ -148,13 +148,13 @@ xfs_qm_dqpurge(
                 * We don't care about getting disk errors here. We need
                 * to purge this dquot anyway, so we go ahead regardless.
                 */
-               error = xfs_dquot_read_buf(NULL, dqp, XBF_TRYLOCK, &bp);
+               error = xfs_dquot_use_attached_buf(dqp, &bp);
                if (error == -EAGAIN) {
                        xfs_dqfunlock(dqp);
                        dqp->q_flags &= ~XFS_DQFLAG_FREEING;
                        goto out_unlock;
                }
-               if (error)
+               if (!bp)
                        goto out_funlock;
 
                /*
@@ -506,8 +506,8 @@ xfs_qm_dquot_isolate(
                /* we have to drop the LRU lock to flush the dquot */
                spin_unlock(&lru->lock);
 
-               error = xfs_dquot_read_buf(NULL, dqp, XBF_TRYLOCK, &bp);
-               if (error) {
+               error = xfs_dquot_use_attached_buf(dqp, &bp);
+               if (!bp || error == -EAGAIN) {
                        xfs_dqfunlock(dqp);
                        goto out_unlock_dirty;
                }
@@ -1331,6 +1331,10 @@ xfs_qm_quotacheck_dqadjust(
                return error;
        }
 
+       error = xfs_dquot_attach_buf(NULL, dqp);
+       if (error)
+               return error;
+
        trace_xfs_dqadjust(dqp);
 
        /*
@@ -1513,9 +1517,13 @@ xfs_qm_flush_one(
                goto out_unlock;
        }
 
-       error = xfs_dquot_read_buf(NULL, dqp, XBF_TRYLOCK, &bp);
+       error = xfs_dquot_use_attached_buf(dqp, &bp);
        if (error)
                goto out_unlock;
+       if (!bp) {
+               error = -EFSCORRUPTED;
+               goto out_unlock;
+       }
 
        error = xfs_qm_dqflush(dqp, bp);
        if (!error)