From 56218fc850cdaccaeb87767c2ca8977ee2f26697 Mon Sep 17 00:00:00 2001
From: Nazir Bilal Yavuz <byavuz81@gmail.com>
Date: Tue, 31 Mar 2026 15:00:40 +0300
Subject: [PATCH] Set the variables that callers might read in
 StartReadBuffersImpl()

When the first requested block is already in the buffer pool, StartRead-
BuffersImpl() returned early after setting *nblocks = 1 without starting
any I/O. In that path, operation->nblocks and operation->buffers were
only initialised inside #ifdef USE_ASSERT_CHECKING, leaving them as zero
/ NULL in non-assert builds.

Callers might want to inspect these values like in the AIO tests. Fix
that problem by unconditionally setting operation->nblocks and
operation->buffers in the early-return hit path.
---
 src/backend/storage/buffer/bufmgr.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index cd21ae3fc36..e6f99ad7668 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -1457,6 +1457,10 @@ StartReadBuffersImpl(ReadBuffersOperation *operation,
 			{
 				*nblocks = 1;
 
+				/* Set the variables that callers might read */
+				operation->buffers = buffers;
+				operation->nblocks = 1;
+
 #ifdef USE_ASSERT_CHECKING
 
 				/*
@@ -1464,9 +1468,7 @@ StartReadBuffersImpl(ReadBuffersOperation *operation,
 				 * CheckReadBuffersOperation() work. Outside of assertions
 				 * that's not necessary when no IO is issued.
 				 */
-				operation->buffers = buffers;
 				operation->blocknum = blockNum;
-				operation->nblocks = 1;
 				operation->nblocks_done = 1;
 				CheckReadBuffersOperation(operation, true);
 #endif
-- 
2.47.3

