Index: src/backend/storage/buffer/bufmgr.c
===================================================================
RCS file: /zfs_data/cvs_pgsql/cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v
retrieving revision 1.228
diff -c -r1.228 bufmgr.c
*** src/backend/storage/buffer/bufmgr.c	1 Jan 2008 19:45:51 -0000	1.228
--- src/backend/storage/buffer/bufmgr.c	11 Apr 2008 15:30:28 -0000
***************
*** 41,46 ****
--- 41,47 ----
  #include "storage/proc.h"
  #include "storage/smgr.h"
  #include "utils/resowner.h"
+ #include "access/heapam.h"
  #include "pgstat.h"
  
  
***************
*** 67,72 ****
--- 68,75 ----
  								 * bufmgr */
  long		NDirectFileWrite;	/* e.g., I/O in psort and hashjoin. */
  
+ /* Hook for page layout convertor */
+ plc_hook_type plc_hook = NULL;
  
  /* local state for StartBufferIO and related functions */
  static volatile BufferDesc *InProgressBuf = NULL;
***************
*** 290,296 ****
--- 293,308 ----
  		if (zeroPage)
  			MemSet((char *) bufBlock, 0, BLCKSZ);
  		else
+ 		{
  			smgrread(reln->rd_smgr, blockNum, (char *) bufBlock);
+ 			/* Page Layout Convertor hook. We assume that page version is on same place. */
+ 			if( plc_hook &&  PageGetPageLayoutVersion(bufBlock) != PG_PAGE_LAYOUT_VERSION )
+ 			{
+ 				plc_hook((char *)bufBlock);
+ 				bufHdr->flags |= (BM_DIRTY | BM_JUST_DIRTIED);
+ 				log_newpage(&reln->rd_node, blockNum ,bufBlock);
+ 			}
+ 		}
  		/* check for garbage data */
  		if (!PageHeaderIsValid((PageHeader) bufBlock))
  		{
Index: src/include/storage/bufmgr.h
===================================================================
RCS file: /zfs_data/cvs_pgsql/cvsroot/pgsql/src/include/storage/bufmgr.h,v
retrieving revision 1.111
diff -c -r1.111 bufmgr.h
*** src/include/storage/bufmgr.h	1 Jan 2008 19:45:58 -0000	1.111
--- src/include/storage/bufmgr.h	28 Mar 2008 14:23:03 -0000
***************
*** 28,33 ****
--- 28,37 ----
  	BAS_VACUUM					/* VACUUM */
  } BufferAccessStrategyType;
  
+ /* Hook for page layout convertor plugin */
+ typedef void (*plc_hook_type)(char *buffer);
+ extern PGDLLIMPORT plc_hook_type plc_hook;
+ 
  /* in globals.c ... this duplicates miscadmin.h */
  extern PGDLLIMPORT int NBuffers;
  
