diff --git a/src/backend/access/gin/ginvacuum.c b/src/backend/access/gin/ginvacuum.c
index e490e6a4bf9efe06bc2a9c801cf88706b496bb51..447d25d3be5c908b871eba4cf605b9eb45d35867 100644
--- a/src/backend/access/gin/ginvacuum.c
+++ b/src/backend/access/gin/ginvacuum.c
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *			$PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.12 2007/02/01 04:16:08 neilc Exp $
+ *			$PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.13 2007/05/31 14:03:09 teodor Exp $
  *-------------------------------------------------------------------------
  */
 
@@ -28,6 +28,7 @@ typedef struct
 	IndexBulkDeleteCallback callback;
 	void	   *callback_state;
 	GinState	ginstate;
+	BufferAccessStrategy	strategy;
 } GinVacuumState;
 
 
@@ -152,7 +153,7 @@ xlogVacuumPage(Relation index, Buffer buffer)
 static bool
 ginVacuumPostingTreeLeaves(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, Buffer *rootBuffer)
 {
-	Buffer		buffer = ReadBuffer(gvs->index, blkno);
+	Buffer		buffer = ReadBufferWithStrategy(gvs->index, blkno, gvs->strategy);
 	Page		page = BufferGetPage(buffer);
 	bool		hasVoidPage = FALSE;
 
@@ -238,9 +239,10 @@ static void
 ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkno,
 			  BlockNumber parentBlkno, OffsetNumber myoff, bool isParentRoot)
 {
-	Buffer		dBuffer = ReadBuffer(gvs->index, deleteBlkno);
-	Buffer		lBuffer = (leftBlkno == InvalidBlockNumber) ? InvalidBuffer : ReadBuffer(gvs->index, leftBlkno);
-	Buffer		pBuffer = ReadBuffer(gvs->index, parentBlkno);
+	Buffer		dBuffer = ReadBufferWithStrategy(gvs->index, deleteBlkno, gvs->strategy);
+	Buffer		lBuffer = (leftBlkno == InvalidBlockNumber) ? 
+							InvalidBuffer : ReadBufferWithStrategy(gvs->index, leftBlkno, gvs->strategy);
+	Buffer		pBuffer = ReadBufferWithStrategy(gvs->index, parentBlkno, gvs->strategy);
 	Page		page,
 				parentPage;
 
@@ -390,7 +392,7 @@ ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDel
 			me = parent->child;
 	}
 
-	buffer = ReadBuffer(gvs->index, blkno);
+	buffer = ReadBufferWithStrategy(gvs->index, blkno, gvs->strategy);
 	page = BufferGetPage(buffer);
 
 	Assert(GinPageIsData(page));
@@ -574,9 +576,10 @@ ginbulkdelete(PG_FUNCTION_ARGS)
 	gvs.result = stats;
 	gvs.callback = callback;
 	gvs.callback_state = callback_state;
+	gvs.strategy = info->strategy;
 	initGinState(&gvs.ginstate, index);
 
-	buffer = ReadBuffer(index, blkno);
+	buffer = ReadBufferWithStrategy(index, blkno, info->strategy);
 
 	/* find leaf page */
 	for (;;)
@@ -607,8 +610,8 @@ ginbulkdelete(PG_FUNCTION_ARGS)
 		blkno = GinItemPointerGetBlockNumber(&(itup)->t_tid);
 		Assert(blkno != InvalidBlockNumber);
 
-		LockBuffer(buffer, GIN_UNLOCK);
-		buffer = ReleaseAndReadBuffer(buffer, index, blkno);
+		UnlockReleaseBuffer(buffer);
+		buffer = ReadBufferWithStrategy(index, blkno, info->strategy);
 	}
 
 	/* right now we found leftmost page in entry's BTree */
@@ -650,7 +653,7 @@ ginbulkdelete(PG_FUNCTION_ARGS)
 		if (blkno == InvalidBlockNumber)		/* rightmost page */
 			break;
 
-		buffer = ReadBuffer(index, blkno);
+		buffer = ReadBufferWithStrategy(index, blkno, info->strategy);
 		LockBuffer(buffer, GIN_EXCLUSIVE);
 	}
 
@@ -713,7 +716,7 @@ ginvacuumcleanup(PG_FUNCTION_ARGS)
 
 		vacuum_delay_point();
 
-		buffer = ReadBuffer(index, blkno);
+		buffer = ReadBufferWithStrategy(index, blkno, info->strategy);
 		LockBuffer(buffer, GIN_SHARE);
 		page = (Page) BufferGetPage(buffer);
 
diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c
index 10d3b4fc56677e00083c173e5c7255d634098ff9..1d2ca735a63b095fbae992e16ab08b8d95598963 100644
--- a/src/backend/access/gist/gistvacuum.c
+++ b/src/backend/access/gist/gistvacuum.c
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.29 2007/01/05 22:19:22 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.30 2007/05/31 14:03:09 teodor Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -35,6 +35,7 @@ typedef struct
 	Relation	index;
 	MemoryContext opCtx;
 	GistBulkDeleteResult *result;
+	BufferAccessStrategy	strategy;
 } GistVacuum;
 
 typedef struct
@@ -83,7 +84,7 @@ gistDeleteSubtree(GistVacuum *gv, BlockNumber blkno)
 	Buffer		buffer;
 	Page		page;
 
-	buffer = ReadBuffer(gv->index, blkno);
+	buffer = ReadBufferWithStrategy(gv->index, blkno, gv->strategy);
 	LockBuffer(buffer, GIST_EXCLUSIVE);
 	page = (Page) BufferGetPage(buffer);
 
@@ -303,7 +304,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion)
 
 	vacuum_delay_point();
 
-	buffer = ReadBuffer(gv->index, blkno);
+	buffer = ReadBufferWithStrategy(gv->index, blkno, gv->strategy);
 	LockBuffer(buffer, GIST_EXCLUSIVE);
 	gistcheckpage(gv->index, buffer);
 	page = (Page) BufferGetPage(buffer);
@@ -550,6 +551,7 @@ gistvacuumcleanup(PG_FUNCTION_ARGS)
 		initGISTstate(&(gv.giststate), rel);
 		gv.opCtx = createTempGistContext();
 		gv.result = stats;
+		gv.strategy = info->strategy;
 
 		/* walk through the entire index for update tuples */
 		res = gistVacuumUpdate(&gv, GIST_ROOT_BLKNO, false);
@@ -600,7 +602,7 @@ gistvacuumcleanup(PG_FUNCTION_ARGS)
 
 		vacuum_delay_point();
 
-		buffer = ReadBuffer(rel, blkno);
+		buffer = ReadBufferWithStrategy(rel, blkno, info->strategy);
 		LockBuffer(buffer, GIST_SHARE);
 		page = (Page) BufferGetPage(buffer);
 
@@ -704,7 +706,7 @@ gistbulkdelete(PG_FUNCTION_ARGS)
 
 	while (stack)
 	{
-		Buffer		buffer = ReadBuffer(rel, stack->blkno);
+		Buffer		buffer = ReadBufferWithStrategy(rel, stack->blkno, info->strategy);
 		Page		page;
 		OffsetNumber i,
 					maxoff;