xfs: rework xfs_buf_incore() API
authorDave Chinner <dchinner@redhat.com>
Thu, 7 Jul 2022 12:05:18 +0000 (22:05 +1000)
committerDave Chinner <david@fromorbit.com>
Thu, 7 Jul 2022 12:05:18 +0000 (22:05 +1000)
Make it consistent with the other buffer APIs to return a error and
the buffer is placed in a parameter.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/libxfs/xfs_attr_remote.c
fs/xfs/scrub/repair.c
fs/xfs/xfs_buf.c
fs/xfs/xfs_buf.h
fs/xfs/xfs_qm.c

index 7298c14..d440393 100644 (file)
@@ -543,6 +543,7 @@ xfs_attr_rmtval_stale(
 {
        struct xfs_mount        *mp = ip->i_mount;
        struct xfs_buf          *bp;
+       int                     error;
 
        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 
@@ -550,14 +551,18 @@ xfs_attr_rmtval_stale(
            XFS_IS_CORRUPT(mp, map->br_startblock == HOLESTARTBLOCK))
                return -EFSCORRUPTED;
 
-       bp = xfs_buf_incore(mp->m_ddev_targp,
+       error = xfs_buf_incore(mp->m_ddev_targp,
                        XFS_FSB_TO_DADDR(mp, map->br_startblock),
-                       XFS_FSB_TO_BB(mp, map->br_blockcount), incore_flags);
-       if (bp) {
-               xfs_buf_stale(bp);
-               xfs_buf_relse(bp);
+                       XFS_FSB_TO_BB(mp, map->br_blockcount),
+                       incore_flags, &bp);
+       if (error) {
+               if (error == -ENOENT)
+                       return 0;
+               return error;
        }
 
+       xfs_buf_stale(bp);
+       xfs_buf_relse(bp);
        return 0;
 }
 
index 1e7b6b2..5e74287 100644 (file)
@@ -457,16 +457,19 @@ xrep_invalidate_blocks(
         * assume it's owned by someone else.
         */
        for_each_xbitmap_block(fsbno, bmr, n, bitmap) {
+               int             error;
+
                /* Skip AG headers and post-EOFS blocks */
                if (!xfs_verify_fsbno(sc->mp, fsbno))
                        continue;
-               bp = xfs_buf_incore(sc->mp->m_ddev_targp,
+               error = xfs_buf_incore(sc->mp->m_ddev_targp,
                                XFS_FSB_TO_DADDR(sc->mp, fsbno),
-                               XFS_FSB_TO_BB(sc->mp, 1), XBF_TRYLOCK);
-               if (bp) {
-                       xfs_trans_bjoin(sc->tp, bp);
-                       xfs_trans_binval(sc->tp, bp);
-               }
+                               XFS_FSB_TO_BB(sc->mp, 1), XBF_TRYLOCK, &bp);
+               if (error)
+                       continue;
+
+               xfs_trans_bjoin(sc->tp, bp);
+               xfs_trans_binval(sc->tp, bp);
        }
 
        return 0;
index bf4e608..143e1c7 100644 (file)
@@ -616,23 +616,6 @@ found:
        return 0;
 }
 
-struct xfs_buf *
-xfs_buf_incore(
-       struct xfs_buftarg      *target,
-       xfs_daddr_t             blkno,
-       size_t                  numblks,
-       xfs_buf_flags_t         flags)
-{
-       struct xfs_buf          *bp;
-       int                     error;
-       DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
-
-       error = xfs_buf_find(target, &map, 1, flags, NULL, &bp);
-       if (error)
-               return NULL;
-       return bp;
-}
-
 /*
  * Assembles a buffer covering the specified range. The code is optimised for
  * cache hits, as metadata intensive workloads will see 3 orders of magnitude
@@ -656,6 +639,8 @@ xfs_buf_get_map(
                goto found;
        if (error != -ENOENT)
                return error;
+       if (flags & XBF_INCORE)
+               return -ENOENT;
 
        error = _xfs_buf_alloc(target, map, nmaps, flags, &new_bp);
        if (error)
index 1ee3056..58e9034 100644 (file)
@@ -42,9 +42,11 @@ struct xfs_buf;
 #define _XBF_DELWRI_Q   (1u << 22)/* buffer on a delwri queue */
 
 /* flags used only as arguments to access routines */
+#define XBF_INCORE      (1u << 29)/* lookup only, return if found in cache */
 #define XBF_TRYLOCK     (1u << 30)/* lock requested, but do not wait */
 #define XBF_UNMAPPED    (1u << 31)/* do not map the buffer */
 
+
 typedef unsigned int xfs_buf_flags_t;
 
 #define XFS_BUF_FLAGS \
@@ -63,6 +65,7 @@ typedef unsigned int xfs_buf_flags_t;
        { _XBF_KMEM,            "KMEM" }, \
        { _XBF_DELWRI_Q,        "DELWRI_Q" }, \
        /* The following interface flags should never be set */ \
+       { XBF_INCORE,           "INCORE" }, \
        { XBF_TRYLOCK,          "TRYLOCK" }, \
        { XBF_UNMAPPED,         "UNMAPPED" }
 
@@ -196,10 +199,6 @@ struct xfs_buf {
 };
 
 /* Finding and Reading Buffers */
-struct xfs_buf *xfs_buf_incore(struct xfs_buftarg *target,
-                          xfs_daddr_t blkno, size_t numblks,
-                          xfs_buf_flags_t flags);
-
 int xfs_buf_get_map(struct xfs_buftarg *target, struct xfs_buf_map *map,
                int nmaps, xfs_buf_flags_t flags, struct xfs_buf **bpp);
 int xfs_buf_read_map(struct xfs_buftarg *target, struct xfs_buf_map *map,
@@ -210,6 +209,19 @@ void xfs_buf_readahead_map(struct xfs_buftarg *target,
                               const struct xfs_buf_ops *ops);
 
 static inline int
+xfs_buf_incore(
+       struct xfs_buftarg      *target,
+       xfs_daddr_t             blkno,
+       size_t                  numblks,
+       xfs_buf_flags_t         flags,
+       struct xfs_buf          **bpp)
+{
+       DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
+
+       return xfs_buf_get_map(target, &map, 1, XBF_INCORE | flags, bpp);
+}
+
+static inline int
 xfs_buf_get(
        struct xfs_buftarg      *target,
        xfs_daddr_t             blkno,
index abf08bb..3517a6b 100644 (file)
@@ -1229,12 +1229,11 @@ xfs_qm_flush_one(
         */
        if (!xfs_dqflock_nowait(dqp)) {
                /* buf is pinned in-core by delwri list */
-               bp = xfs_buf_incore(mp->m_ddev_targp, dqp->q_blkno,
-                               mp->m_quotainfo->qi_dqchunklen, 0);
-               if (!bp) {
-                       error = -EINVAL;
+               error = xfs_buf_incore(mp->m_ddev_targp, dqp->q_blkno,
+                               mp->m_quotainfo->qi_dqchunklen, 0, &bp);
+               if (error)
                        goto out_unlock;
-               }
+
                xfs_buf_unlock(bp);
 
                xfs_buf_delwri_pushbuf(bp, buffer_list);