xfs: split xfs_buf_rele for cached vs uncached buffers
authorChristoph Hellwig <hch@lst.de>
Thu, 22 Feb 2024 20:41:02 +0000 (12:41 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 22 Feb 2024 20:41:02 +0000 (12:41 -0800)
xfs_buf_rele is a bit confusing because it mixes up handling of normal
cached and the special uncached buffers without much explanation.
Split the handling into two different helpers, and use a clearly named
helper that checks the hash key to distinguish the two cases instead
of checking the pag pointer.

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

index fb80cae0b2e58d7620cc928de7c1f0e497343114..1e85780411d57ede57b06edadc1f3cb01e05d830 100644 (file)
@@ -60,6 +60,11 @@ xfs_buf_submit(
        return __xfs_buf_submit(bp, !(bp->b_flags & XBF_ASYNC));
 }
 
+static inline bool xfs_buf_is_uncached(struct xfs_buf *bp)
+{
+       return bp->b_rhash_key == XFS_BUF_DADDR_NULL;
+}
+
 static inline int
 xfs_buf_is_vmapped(
        struct xfs_buf  *bp)
@@ -996,12 +1001,19 @@ xfs_buf_hold(
        atomic_inc(&bp->b_hold);
 }
 
-/*
- * Release a hold on the specified buffer. If the hold count is 1, the buffer is
- * placed on LRU or freed (depending on b_lru_ref).
- */
-void
-xfs_buf_rele(
+static void
+xfs_buf_rele_uncached(
+       struct xfs_buf          *bp)
+{
+       ASSERT(list_empty(&bp->b_lru));
+       if (atomic_dec_and_test(&bp->b_hold)) {
+               xfs_buf_ioacct_dec(bp);
+               xfs_buf_free(bp);
+       }
+}
+
+static void
+xfs_buf_rele_cached(
        struct xfs_buf          *bp)
 {
        struct xfs_perag        *pag = bp->b_pag;
@@ -1010,15 +1022,6 @@ xfs_buf_rele(
 
        trace_xfs_buf_rele(bp, _RET_IP_);
 
-       if (!pag) {
-               ASSERT(list_empty(&bp->b_lru));
-               if (atomic_dec_and_test(&bp->b_hold)) {
-                       xfs_buf_ioacct_dec(bp);
-                       xfs_buf_free(bp);
-               }
-               return;
-       }
-
        ASSERT(atomic_read(&bp->b_hold) > 0);
 
        /*
@@ -1086,6 +1089,19 @@ out_unlock:
                xfs_buf_free(bp);
 }
 
+/*
+ * Release a hold on the specified buffer.
+ */
+void
+xfs_buf_rele(
+       struct xfs_buf          *bp)
+{
+       trace_xfs_buf_rele(bp, _RET_IP_);
+       if (xfs_buf_is_uncached(bp))
+               xfs_buf_rele_uncached(bp);
+       else
+               xfs_buf_rele_cached(bp);
+}
 
 /*
  *     Lock a buffer object, if it is not already locked.