*** a/src/backend/access/transam/xact.c
--- b/src/backend/access/transam/xact.c
***************
*** 5641,5646 **** xact_redo_commit(xl_xact_parsed_commit *parsed,
--- 5641,5648 ----
  	/* Make sure files supposed to be dropped are dropped */
  	if (parsed->nrels > 0)
  	{
+ 		SMgrRelation *srels = NULL;
+ 
  		/*
  		 * First update minimum recovery point to cover this WAL record. Once
  		 * a relation is deleted, there's no going back. The buffer manager
***************
*** 5658,5663 **** xact_redo_commit(xl_xact_parsed_commit *parsed,
--- 5660,5666 ----
  		 */
  		XLogFlush(lsn);
  
+ 		srels = palloc(sizeof(SMgrRelation) * parsed->nrels);
  		for (i = 0; i < parsed->nrels; i++)
  		{
  			SMgrRelation srel = smgropen(parsed->xnodes[i], InvalidBackendId);
***************
*** 5665,5673 **** xact_redo_commit(xl_xact_parsed_commit *parsed,
  
  			for (fork = 0; fork <= MAX_FORKNUM; fork++)
  				XLogDropRelation(parsed->xnodes[i], fork);
! 			smgrdounlink(srel, true);
! 			smgrclose(srel);
  		}
  	}
  
  	/*
--- 5668,5681 ----
  
  			for (fork = 0; fork <= MAX_FORKNUM; fork++)
  				XLogDropRelation(parsed->xnodes[i], fork);
! 			srels[i] = srel;
  		}
+ 
+ 		smgrdounlinkall(srels, parsed->nrels, true);
+ 
+ 		for (i = 0; i < parsed->nrels; i++)
+ 			smgrclose(srels[i]);
+ 		pfree(srels);
  	}
  
  	/*
***************
*** 5708,5713 **** xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
--- 5716,5722 ----
  {
  	int			i;
  	TransactionId max_xid;
+ 	SMgrRelation *srels = NULL;
  
  	Assert(TransactionIdIsValid(xid));
  
***************
*** 5771,5776 **** xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
--- 5780,5786 ----
  	}
  
  	/* Make sure files supposed to be dropped are dropped */
+ 	srels = palloc(sizeof(SMgrRelation) * parsed->nrels);
  	for (i = 0; i < parsed->nrels; i++)
  	{
  		SMgrRelation srel = smgropen(parsed->xnodes[i], InvalidBackendId);
***************
*** 5778,5786 **** xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
  
  		for (fork = 0; fork <= MAX_FORKNUM; fork++)
  			XLogDropRelation(parsed->xnodes[i], fork);
! 		smgrdounlink(srel, true);
! 		smgrclose(srel);
  	}
  }
  
  void
--- 5788,5801 ----
  
  		for (fork = 0; fork <= MAX_FORKNUM; fork++)
  			XLogDropRelation(parsed->xnodes[i], fork);
! 		srels[i] = srel;
  	}
+ 
+ 	smgrdounlinkall(srels, parsed->nrels, true);
+ 
+ 	for (i = 0; i < parsed->nrels; i++)
+ 		smgrclose(srels[i]);
+ 	pfree(srels);
  }
  
  void
