summaryrefslogtreecommitdiff
path: root/fs/xfs/xfs_buf.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2025-03-10 14:19:05 +0100
committerCarlos Maiolino <cem@kernel.org>2025-03-10 14:29:44 +0100
commitf2a3717a74c2cf01e29ea3aba355e171eb0d5f5f (patch)
tree88fec990feaab22a9e83a05bac62f5071b27a9e0 /fs/xfs/xfs_buf.c
parent69659e46b7588d2fd5e4644dec9e61127bbfd5f3 (diff)
xfs: add a fast path to xfs_buf_zero when b_addr is set
No need to walk the page list if bp->b_addr is valid. That also means b_offset doesn't need to be taken into account in the unmapped loop as b_offset is only set for kmem backed buffers which are always mapped. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Carlos Maiolino <cem@kernel.org>
Diffstat (limited to 'fs/xfs/xfs_buf.c')
-rw-r--r--fs/xfs/xfs_buf.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index 5d560e9073f4..ba0bdff3ad57 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -1633,13 +1633,18 @@ xfs_buf_zero(
{
size_t bend;
+ if (bp->b_addr) {
+ memset(bp->b_addr + boff, 0, bsize);
+ return;
+ }
+
bend = boff + bsize;
while (boff < bend) {
struct page *page;
int page_index, page_offset, csize;
- page_index = (boff + bp->b_offset) >> PAGE_SHIFT;
- page_offset = (boff + bp->b_offset) & ~PAGE_MASK;
+ page_index = boff >> PAGE_SHIFT;
+ page_offset = boff & ~PAGE_MASK;
page = bp->b_pages[page_index];
csize = min_t(size_t, PAGE_SIZE - page_offset,
BBTOB(bp->b_length) - boff);