From 53f491e2565f42fc1fcb3612fe821b1c3b796d4b Mon Sep 17 00:00:00 2001
From: Matthias van de Meent <boekewurm+postgres@gmail.com>
Date: Sun, 5 Apr 2026 21:46:31 +0200
Subject: [PATCH vnocfbot.v11 1/2] Add const qualification in SLRU subsystem

With SlruCtl being replaced with SlruDesc*, we can const-qualify the
input arguments of various SLRU functions without significant effort.
In passing, some other arguments are also const-qualified.
---
 src/backend/access/transam/slru.c      | 78 ++++++++++++++------------
 src/include/access/slru.h              | 38 +++++++------
 src/test/modules/test_slru/test_slru.c |  3 +-
 3 files changed, 63 insertions(+), 56 deletions(-)

diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c
index 47dd52d6749..a1e688dd702 100644
--- a/src/backend/access/transam/slru.c
+++ b/src/backend/access/transam/slru.c
@@ -91,7 +91,7 @@
  *  dir/123456 for [2^20, 2^24-1]
  */
 static inline int
-SlruFileName(SlruDesc *ctl, char *path, int64 segno)
+SlruFileName(const SlruDesc *ctl, char *path, int64 segno)
 {
 	if (ctl->options.long_segment_names)
 	{
@@ -178,19 +178,22 @@ static SlruErrorCause slru_errcause;
 static int	slru_errno;
 
 
-static void SimpleLruZeroLSNs(SlruDesc *ctl, int slotno);
-static void SimpleLruWaitIO(SlruDesc *ctl, int slotno);
-static void SlruInternalWritePage(SlruDesc *ctl, int slotno, SlruWriteAll fdata);
-static bool SlruPhysicalReadPage(SlruDesc *ctl, int64 pageno, int slotno);
-static bool SlruPhysicalWritePage(SlruDesc *ctl, int64 pageno, int slotno,
+static void SimpleLruZeroLSNs(const SlruDesc *ctl, int slotno);
+static void SimpleLruWaitIO(const SlruDesc *ctl, int slotno);
+static void SlruInternalWritePage(const SlruDesc *ctl, int slotno,
 								  SlruWriteAll fdata);
-static void SlruReportIOError(SlruDesc *ctl, int64 pageno,
+static bool SlruPhysicalReadPage(const SlruDesc *ctl, int64 pageno,
+								 int slotno);
+static bool SlruPhysicalWritePage(const SlruDesc *ctl, int64 pageno,
+								  int slotno, SlruWriteAll fdata);
+static void SlruReportIOError(const SlruDesc *ctl, int64 pageno,
 							  const void *opaque_data);
-static int	SlruSelectLRUPage(SlruDesc *ctl, int64 pageno);
+static int	SlruSelectLRUPage(const SlruDesc *ctl, int64 pageno);
 
-static bool SlruScanDirCbDeleteCutoff(SlruDesc *ctl, char *filename,
+static bool SlruScanDirCbDeleteCutoff(const SlruDesc *ctl,
+									  const char *filename,
 									  int64 segpage, void *data);
-static void SlruInternalDeleteSegment(SlruDesc *ctl, int64 segno);
+static void SlruInternalDeleteSegment(const SlruDesc *ctl, int64 segno);
 static inline void SlruRecentlyUsed(SlruShared shared, int slotno);
 
 
@@ -394,7 +397,7 @@ check_slru_buffers(const char *name, int *newval)
  * Bank lock must be held at entry, and will be held at exit.
  */
 int
-SimpleLruZeroPage(SlruDesc *ctl, int64 pageno)
+SimpleLruZeroPage(const SlruDesc *ctl, int64 pageno)
 {
 	SlruShared	shared = ctl->shared;
 	int			slotno;
@@ -447,7 +450,7 @@ SimpleLruZeroPage(SlruDesc *ctl, int64 pageno)
  * This assumes that InvalidXLogRecPtr is bitwise-all-0.
  */
 static void
-SimpleLruZeroLSNs(SlruDesc *ctl, int slotno)
+SimpleLruZeroLSNs(const SlruDesc *ctl, int slotno)
 {
 	SlruShared	shared = ctl->shared;
 
@@ -463,7 +466,7 @@ SimpleLruZeroLSNs(SlruDesc *ctl, int slotno)
  * SLRU bank lock is acquired and released here.
  */
 void
-SimpleLruZeroAndWritePage(SlruDesc *ctl, int64 pageno)
+SimpleLruZeroAndWritePage(const SlruDesc *ctl, int64 pageno)
 {
 	int			slotno;
 	LWLock	   *lock;
@@ -489,7 +492,7 @@ SimpleLruZeroAndWritePage(SlruDesc *ctl, int64 pageno)
  * Bank lock must be held at entry, and will be held at exit.
  */
 static void
-SimpleLruWaitIO(SlruDesc *ctl, int slotno)
+SimpleLruWaitIO(const SlruDesc *ctl, int slotno)
 {
 	SlruShared	shared = ctl->shared;
 	int			bankno = SlotGetBankNumber(slotno);
@@ -547,7 +550,7 @@ SimpleLruWaitIO(SlruDesc *ctl, int slotno)
  * The correct bank lock must be held at entry, and will be held at exit.
  */
 int
-SimpleLruReadPage(SlruDesc *ctl, int64 pageno, bool write_ok,
+SimpleLruReadPage(const SlruDesc *ctl, int64 pageno, bool write_ok,
 				  const void *opaque_data)
 {
 	SlruShared	shared = ctl->shared;
@@ -651,7 +654,7 @@ SimpleLruReadPage(SlruDesc *ctl, int64 pageno, bool write_ok,
  * It is unspecified whether the lock will be shared or exclusive.
  */
 int
-SimpleLruReadPage_ReadOnly(SlruDesc *ctl, int64 pageno, const void *opaque_data)
+SimpleLruReadPage_ReadOnly(const SlruDesc *ctl, int64 pageno, const void *opaque_data)
 {
 	SlruShared	shared = ctl->shared;
 	LWLock	   *banklock = SimpleLruGetBankLock(ctl, pageno);
@@ -698,7 +701,7 @@ SimpleLruReadPage_ReadOnly(SlruDesc *ctl, int64 pageno, const void *opaque_data)
  * Bank lock must be held at entry, and will be held at exit.
  */
 static void
-SlruInternalWritePage(SlruDesc *ctl, int slotno, SlruWriteAll fdata)
+SlruInternalWritePage(const SlruDesc *ctl, int slotno, SlruWriteAll fdata)
 {
 	SlruShared	shared = ctl->shared;
 	int64		pageno = shared->page_number[slotno];
@@ -778,7 +781,7 @@ SlruInternalWritePage(SlruDesc *ctl, int slotno, SlruWriteAll fdata)
  * fdata is always passed a NULL here.
  */
 void
-SimpleLruWritePage(SlruDesc *ctl, int slotno)
+SimpleLruWritePage(const SlruDesc *ctl, int slotno)
 {
 	Assert(ctl->shared->page_status[slotno] != SLRU_PAGE_EMPTY);
 
@@ -792,7 +795,7 @@ SimpleLruWritePage(SlruDesc *ctl, int slotno)
  * large enough to contain the given page.
  */
 bool
-SimpleLruDoesPhysicalPageExist(SlruDesc *ctl, int64 pageno)
+SimpleLruDoesPhysicalPageExist(const SlruDesc *ctl, int64 pageno)
 {
 	int64		segno = pageno / SLRU_PAGES_PER_SEGMENT;
 	int			rpageno = pageno % SLRU_PAGES_PER_SEGMENT;
@@ -850,7 +853,7 @@ SimpleLruDoesPhysicalPageExist(SlruDesc *ctl, int64 pageno)
  * read/write operations.  We could cache one virtual file pointer ...
  */
 static bool
-SlruPhysicalReadPage(SlruDesc *ctl, int64 pageno, int slotno)
+SlruPhysicalReadPage(const SlruDesc *ctl, int64 pageno, int slotno)
 {
 	SlruShared	shared = ctl->shared;
 	int64		segno = pageno / SLRU_PAGES_PER_SEGMENT;
@@ -922,7 +925,7 @@ SlruPhysicalReadPage(SlruDesc *ctl, int64 pageno, int slotno)
  * SimpleLruWriteAll.
  */
 static bool
-SlruPhysicalWritePage(SlruDesc *ctl, int64 pageno, int slotno, SlruWriteAll fdata)
+SlruPhysicalWritePage(const SlruDesc *ctl, int64 pageno, int slotno, SlruWriteAll fdata)
 {
 	SlruShared	shared = ctl->shared;
 	int64		segno = pageno / SLRU_PAGES_PER_SEGMENT;
@@ -1094,7 +1097,7 @@ SlruPhysicalWritePage(SlruDesc *ctl, int64 pageno, int slotno, SlruWriteAll fdat
  * SlruPhysicalWritePage.  Call this after cleaning up shared-memory state.
  */
 static void
-SlruReportIOError(SlruDesc *ctl, int64 pageno, const void *opaque_data)
+SlruReportIOError(const SlruDesc *ctl, int64 pageno, const void *opaque_data)
 {
 	int64		segno = pageno / SLRU_PAGES_PER_SEGMENT;
 	int			rpageno = pageno % SLRU_PAGES_PER_SEGMENT;
@@ -1216,7 +1219,7 @@ SlruRecentlyUsed(SlruShared shared, int slotno)
  * The correct bank lock must be held at entry, and will be held at exit.
  */
 static int
-SlruSelectLRUPage(SlruDesc *ctl, int64 pageno)
+SlruSelectLRUPage(const SlruDesc *ctl, int64 pageno)
 {
 	SlruShared	shared = ctl->shared;
 
@@ -1369,7 +1372,7 @@ SlruSelectLRUPage(SlruDesc *ctl, int64 pageno)
  * entries are on disk.
  */
 void
-SimpleLruWriteAll(SlruDesc *ctl, bool allow_redirtied)
+SimpleLruWriteAll(const SlruDesc *ctl, bool allow_redirtied)
 {
 	SlruShared	shared = ctl->shared;
 	SlruWriteAllData fdata;
@@ -1455,7 +1458,7 @@ SimpleLruWriteAll(SlruDesc *ctl, bool allow_redirtied)
  * after it has accrued freshly-written data.
  */
 void
-SimpleLruTruncate(SlruDesc *ctl, int64 cutoffPage)
+SimpleLruTruncate(const SlruDesc *ctl, int64 cutoffPage)
 {
 	SlruShared	shared = ctl->shared;
 	int			prevbank;
@@ -1550,7 +1553,7 @@ restart:
  * they either can't yet contain anything, or have already been cleaned out.
  */
 static void
-SlruInternalDeleteSegment(SlruDesc *ctl, int64 segno)
+SlruInternalDeleteSegment(const SlruDesc *ctl, int64 segno)
 {
 	char		path[MAXPGPATH];
 
@@ -1573,7 +1576,7 @@ SlruInternalDeleteSegment(SlruDesc *ctl, int64 segno)
  * Delete an individual SLRU segment, identified by the segment number.
  */
 void
-SlruDeleteSegment(SlruDesc *ctl, int64 segno)
+SlruDeleteSegment(const SlruDesc *ctl, int64 segno)
 {
 	SlruShared	shared = ctl->shared;
 	int			prevbank = SlotGetBankNumber(0);
@@ -1650,7 +1653,7 @@ restart:
  * first>=cutoff && last>=cutoff: no; every page of this segment is too young
  */
 static bool
-SlruMayDeleteSegment(SlruDesc *ctl, int64 segpage, int64 cutoffPage)
+SlruMayDeleteSegment(const SlruDesc *ctl, int64 segpage, int64 cutoffPage)
 {
 	int64		seg_last_page = segpage + SLRU_PAGES_PER_SEGMENT - 1;
 
@@ -1662,7 +1665,7 @@ SlruMayDeleteSegment(SlruDesc *ctl, int64 segpage, int64 cutoffPage)
 
 #ifdef USE_ASSERT_CHECKING
 static void
-SlruPagePrecedesTestOffset(SlruDesc *ctl, int per_page, uint32 offset)
+SlruPagePrecedesTestOffset(const SlruDesc *ctl, int per_page, uint32 offset)
 {
 	TransactionId lhs,
 				rhs;
@@ -1747,7 +1750,7 @@ SlruPagePrecedesTestOffset(SlruDesc *ctl, int per_page, uint32 offset)
  * do not apply to them.)
  */
 void
-SlruPagePrecedesUnitTests(SlruDesc *ctl, int per_page)
+SlruPagePrecedesUnitTests(const SlruDesc *ctl, int per_page)
 {
 	/* Test first, middle and last entries of a page. */
 	SlruPagePrecedesTestOffset(ctl, per_page, 0);
@@ -1762,8 +1765,8 @@ SlruPagePrecedesUnitTests(SlruDesc *ctl, int per_page)
  *		one containing the page passed as "data".
  */
 bool
-SlruScanDirCbReportPresence(SlruDesc *ctl, char *filename, int64 segpage,
-							void *data)
+SlruScanDirCbReportPresence(const SlruDesc *ctl, const char *filename,
+							int64 segpage, void *data)
 {
 	int64		cutoffPage = *(int64 *) data;
 
@@ -1778,7 +1781,7 @@ SlruScanDirCbReportPresence(SlruDesc *ctl, char *filename, int64 segpage,
  *		This callback deletes segments prior to the one passed in as "data".
  */
 static bool
-SlruScanDirCbDeleteCutoff(SlruDesc *ctl, char *filename, int64 segpage,
+SlruScanDirCbDeleteCutoff(const SlruDesc *ctl, const char *filename, int64 segpage,
 						  void *data)
 {
 	int64		cutoffPage = *(int64 *) data;
@@ -1794,7 +1797,8 @@ SlruScanDirCbDeleteCutoff(SlruDesc *ctl, char *filename, int64 segpage,
  *		This callback deletes all segments.
  */
 bool
-SlruScanDirCbDeleteAll(SlruDesc *ctl, char *filename, int64 segpage, void *data)
+SlruScanDirCbDeleteAll(const SlruDesc *ctl, const char *filename,
+					   int64 segpage, void *data)
 {
 	SlruInternalDeleteSegment(ctl, segpage / SLRU_PAGES_PER_SEGMENT);
 
@@ -1808,7 +1812,7 @@ SlruScanDirCbDeleteAll(SlruDesc *ctl, char *filename, int64 segpage, void *data)
  * SLRU segment.
  */
 static inline bool
-SlruCorrectSegmentFilenameLength(SlruDesc *ctl, size_t len)
+SlruCorrectSegmentFilenameLength(const SlruDesc *ctl, size_t len)
 {
 	if (ctl->options.long_segment_names)
 		return (len == 15);		/* see SlruFileName() */
@@ -1841,7 +1845,7 @@ SlruCorrectSegmentFilenameLength(SlruDesc *ctl, size_t len)
  * Note that no locking is applied.
  */
 bool
-SlruScanDirectory(SlruDesc *ctl, SlruScanCallback callback, void *data)
+SlruScanDirectory(const SlruDesc *ctl, SlruScanCallback callback, void *data)
 {
 	bool		retval = false;
 	DIR		   *cldir;
@@ -1881,7 +1885,7 @@ SlruScanDirectory(SlruDesc *ctl, SlruScanCallback callback, void *data)
  * performs the fsync.
  */
 int
-SlruSyncFileTag(SlruDesc *ctl, const FileTag *ftag, char *path)
+SlruSyncFileTag(const SlruDesc *ctl, const FileTag *ftag, char *path)
 {
 	int			fd;
 	int			save_errno;
diff --git a/src/include/access/slru.h b/src/include/access/slru.h
index 36a7514d7a0..74ea84deec5 100644
--- a/src/include/access/slru.h
+++ b/src/include/access/slru.h
@@ -200,7 +200,7 @@ typedef struct SlruDesc
  * respective bank.
  */
 static inline LWLock *
-SimpleLruGetBankLock(SlruDesc *ctl, int64 pageno)
+SimpleLruGetBankLock(const SlruDesc *ctl, int64 pageno)
 {
 	int			bankno;
 
@@ -215,34 +215,36 @@ extern void SimpleLruRequestWithOpts(const SlruOpts *options);
 	SimpleLruRequestWithOpts(&(SlruOpts){__VA_ARGS__})
 
 extern int	SimpleLruAutotuneBuffers(int divisor, int max);
-extern int	SimpleLruZeroPage(SlruDesc *ctl, int64 pageno);
-extern void SimpleLruZeroAndWritePage(SlruDesc *ctl, int64 pageno);
-extern int	SimpleLruReadPage(SlruDesc *ctl, int64 pageno, bool write_ok,
+extern int	SimpleLruZeroPage(const SlruDesc *ctl, int64 pageno);
+extern void SimpleLruZeroAndWritePage(const SlruDesc *ctl, int64 pageno);
+extern int	SimpleLruReadPage(const SlruDesc *ctl, int64 pageno, bool write_ok,
 							  const void *opaque_data);
-extern int	SimpleLruReadPage_ReadOnly(SlruDesc *ctl, int64 pageno,
+extern int	SimpleLruReadPage_ReadOnly(const SlruDesc *ctl, int64 pageno,
 									   const void *opaque_data);
-extern void SimpleLruWritePage(SlruDesc *ctl, int slotno);
-extern void SimpleLruWriteAll(SlruDesc *ctl, bool allow_redirtied);
+extern void SimpleLruWritePage(const SlruDesc *ctl, int slotno);
+extern void SimpleLruWriteAll(const SlruDesc *ctl, bool allow_redirtied);
 #ifdef USE_ASSERT_CHECKING
-extern void SlruPagePrecedesUnitTests(SlruDesc *ctl, int per_page);
+extern void SlruPagePrecedesUnitTests(const SlruDesc *ctl, int per_page);
 #else
 #define SlruPagePrecedesUnitTests(ctl, per_page) do {} while (0)
 #endif
-extern void SimpleLruTruncate(SlruDesc *ctl, int64 cutoffPage);
-extern bool SimpleLruDoesPhysicalPageExist(SlruDesc *ctl, int64 pageno);
+extern void SimpleLruTruncate(const SlruDesc *ctl, int64 cutoffPage);
+extern bool SimpleLruDoesPhysicalPageExist(const SlruDesc *ctl, int64 pageno);
 
-typedef bool (*SlruScanCallback) (SlruDesc *ctl, char *filename, int64 segpage,
-								  void *data);
-extern bool SlruScanDirectory(SlruDesc *ctl, SlruScanCallback callback, void *data);
-extern void SlruDeleteSegment(SlruDesc *ctl, int64 segno);
+typedef bool (*SlruScanCallback) (const SlruDesc *ctl, const char *filename,
+								  int64 segpage, void *data);
+extern bool SlruScanDirectory(const SlruDesc *ctl, SlruScanCallback callback,
+							  void *data);
+extern void SlruDeleteSegment(const SlruDesc *ctl, int64 segno);
 
-extern int	SlruSyncFileTag(SlruDesc *ctl, const FileTag *ftag, char *path);
+extern int	SlruSyncFileTag(const SlruDesc *ctl, const FileTag *ftag,
+							char *path);
 
 /* SlruScanDirectory public callbacks */
-extern bool SlruScanDirCbReportPresence(SlruDesc *ctl, char *filename,
+extern bool SlruScanDirCbReportPresence(const SlruDesc *ctl, const char *filename,
 										int64 segpage, void *data);
-extern bool SlruScanDirCbDeleteAll(SlruDesc *ctl, char *filename, int64 segpage,
-								   void *data);
+extern bool SlruScanDirCbDeleteAll(const SlruDesc *ctl, const char *filename,
+								   int64 segpage, void *data);
 extern bool check_slru_buffers(const char *name, int *newval);
 
 extern void shmem_slru_init(void *location, ShmemStructOpts *options);
diff --git a/src/test/modules/test_slru/test_slru.c b/src/test/modules/test_slru/test_slru.c
index 40efffdbf62..5dfa082ed25 100644
--- a/src/test/modules/test_slru/test_slru.c
+++ b/src/test/modules/test_slru/test_slru.c
@@ -55,7 +55,8 @@ static const ShmemCallbacks test_slru_shmem_callbacks = {
 #define TestSlruCtl			(&TestSlruDesc)
 
 static bool
-test_slru_scan_cb(SlruDesc *ctl, char *filename, int64 segpage, void *data)
+test_slru_scan_cb(const SlruDesc *ctl, const char *filename, int64 segpage,
+				  void *data)
 {
 	elog(NOTICE, "Calling test_slru_scan_cb()");
 	return SlruScanDirCbDeleteAll(ctl, filename, segpage, data);
-- 
2.50.1 (Apple Git-155)

