diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c
new file mode 100644
index c5732c3..81f6efa
*** a/src/backend/access/gin/ginfast.c
--- b/src/backend/access/gin/ginfast.c
***************
*** 24,29 ****
--- 24,30 ----
  #include "miscadmin.h"
  #include "utils/memutils.h"
  #include "utils/rel.h"
+ #include "storage/lmgr.h"
  
  /* GUC parameter */
  int			gin_pending_list_limit = 0;
*************** ginInsertCleanup(GinState *ginstate,
*** 745,750 ****
--- 746,757 ----
  	KeyArray	datums;
  	BlockNumber blkno;
  
+ 	if (vac_delay) 
+ 	    LockRelation(index,ShareUpdateExclusiveLock);
+ 	else 
+ 	    if (!ConditionalLockRelation(index,ShareUpdateExclusiveLock))
+ 			return;
+ 
  	metabuffer = ReadBuffer(index, GIN_METAPAGE_BLKNO);
  	LockBuffer(metabuffer, GIN_SHARE);
  	metapage = BufferGetPage(metabuffer);
*************** ginInsertCleanup(GinState *ginstate,
*** 754,759 ****
--- 761,767 ----
  	{
  		/* Nothing to do */
  		UnlockReleaseBuffer(metabuffer);
+ 		UnlockRelation(index,ShareUpdateExclusiveLock);
  		return;
  	}
  
*************** ginInsertCleanup(GinState *ginstate,
*** 929,934 ****
--- 937,944 ----
  		page = BufferGetPage(buffer);
  	}
  
+ 	UnlockRelation(index,ShareUpdateExclusiveLock);
+ 
  	ReleaseBuffer(metabuffer);
  
  	/* Clean up temporary space */
