diff --git a/src/backend/storage/freespace/freespace.c b/src/backend/storage/freespace/freespace.c
index 130649601c..11fcc038d1 100644
--- a/src/backend/storage/freespace/freespace.c
+++ b/src/backend/storage/freespace/freespace.c
@@ -1087,9 +1087,30 @@ fsm_allow_writes(Relation rel, BlockNumber heapblk,
 			skip_get_nblocks = false;
 	}
 
+	/* Might have to re-open if a cache flush happened */
 	RelationOpenSmgr(rel);
-	if (smgrexists(rel->rd_smgr, FSM_FORKNUM))
+
+	/* If we haven't cached the size of the FSM yet, check it directly. */
+	if (rel->rd_smgr->smgr_fsm_nblocks == InvalidBlockNumber)
+	{
+		if (smgrexists(rel->rd_smgr, FSM_FORKNUM))
+		{
+			rel->rd_smgr->smgr_fsm_nblocks = smgrnblocks(rel->rd_smgr,
+														 FSM_FORKNUM);
+			return true;
+		}
+		else
+		{
+			rel->rd_smgr->smgr_fsm_nblocks = 0;
+		}
+	}
+	/* If smgr_fsm_nblocks is positive then it must exist. */
+	else if (rel->rd_smgr->smgr_fsm_nblocks > 0)
+	{
 		return true;
+	}
+
+	/* smgr_fsm_nblocks == 0 means it doesn't exist, do nothing. */
 
 	if (skip_get_nblocks)
 		return false;
