summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2026-07-15 16:50:56 +0200
committerCarlos Maiolino <cem@kernel.org>2026-08-10 08:34:43 +0200
commitb6ba780af010f0d1c5bfb970fe692a02559de473 (patch)
treed49d3d95c278e6d784ffef3ad8991aed571bd08f
parent568c8798a3d0afabc133d7b34d37155daa95d1f2 (diff)
downloadlinux-stable-b6ba780af010f0d1c5bfb970fe692a02559de473.tar.gz
linux-stable-b6ba780af010f0d1c5bfb970fe692a02559de473.zip
xfs: split out a lower-level xfs_buf_get_map helper from xfs_find_get_buf
xfs_buf_get_map is currently reused to implement xfs_buf_read_map and xfs_buf_readahead_map. This causes double accounting of buf_get stat and leads to some ugly overload of the flags. Split out a slightly lower-level xfs_find_get_buf helper and use that to implement xfs_buf_get_map, xfs_buf_read_map and xfs_buf_readahead_map. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Carlos Maiolino <cem@kernel.org>
-rw-r--r--fs/xfs/xfs_buf.c41
1 files changed, 29 insertions, 12 deletions
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index 8d252b21579e..f56bd8b0a998 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -514,8 +514,8 @@ out_free_buf:
* cache hits, as metadata intensive workloads will see 3 orders of magnitude
* more hits than misses.
*/
-int
-xfs_buf_get_map(
+static int
+xfs_find_get_buf(
struct xfs_buftarg *btp,
struct xfs_buf_map *map,
int nmaps,
@@ -552,16 +552,33 @@ xfs_buf_get_map(
return error;
}
+ *bpp = bp;
+ return 0;
+}
+
+int
+xfs_buf_get_map(
+ struct xfs_buftarg *btp,
+ struct xfs_buf_map *map,
+ int nmaps,
+ xfs_buf_flags_t flags,
+ struct xfs_buf **bpp)
+{
+ int error;
+
+ ASSERT(!(flags & ~(XBF_TRYLOCK | XBF_INCORE | XBF_LIVESCAN)));
+ ASSERT(!(flags & XBF_LIVESCAN) || (flags & XBF_INCORE));
+
/*
- * Clear b_error if this is a lookup from a caller that doesn't expect
- * valid data to be found in the buffer.
+ * Zero the buffer and clear b_error as xfs_buf_get_map callers don't
+ * expect valid data to be found in the buffer.
*/
- if (!(flags & XBF_READ))
- xfs_buf_ioerror(bp, 0);
-
+ error = xfs_find_get_buf(btp, map, nmaps, flags, bpp);
+ if (error)
+ return error;
XFS_STATS_INC(btp->bt_mount, xb_get);
- trace_xfs_buf_get(bp, flags, _RET_IP_);
- *bpp = bp;
+ trace_xfs_buf_get(*bpp, flags, _RET_IP_);
+ xfs_buf_ioerror(*bpp, 0);
return 0;
}
@@ -625,12 +642,12 @@ xfs_buf_read_map(
struct xfs_buf *bp;
int error;
- ASSERT(!(flags & (XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD)));
+ ASSERT(!(flags & ~XBF_TRYLOCK));
flags |= XBF_READ;
*bpp = NULL;
- error = xfs_buf_get_map(target, map, nmaps, flags, &bp);
+ error = xfs_find_get_buf(target, map, nmaps, flags, &bp);
if (error)
return error;
@@ -706,7 +723,7 @@ xfs_buf_readahead_map(
if (xfs_buftarg_is_mem(target))
return;
- if (xfs_buf_get_map(target, map, nmaps, flags | XBF_TRYLOCK, &bp))
+ if (xfs_find_get_buf(target, map, nmaps, flags | XBF_TRYLOCK, &bp))
return;
trace_xfs_buf_readahead(bp, 0, _RET_IP_);