diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c
index 9540279..c354ef4 100644
--- a/src/backend/storage/file/fd.c
+++ b/src/backend/storage/file/fd.c
@@ -1418,6 +1418,26 @@ FileSeek(File file, off_t offset, int whence)
 	return VfdCache[file].seekPos;
 }
 
+off_t
+FileSize(File file)
+{
+	int			returnCode;
+	struct stat	sb;
+
+	Assert(FileIsValid(file));
+
+	DO_DB(elog(LOG, "FileSize: %d (%s)", file, VfdCache[file].fileName));
+
+	returnCode = FileAccess(file);
+	if (returnCode < 0)
+		return returnCode;
+	returnCode = fstat(VfdCache[file].fd, &sb);
+	if (returnCode < 0)
+		return returnCode;
+
+	return sb.st_size;
+}
+
 /*
  * XXX not actually used but here for completeness
  */
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c
index 7f44606..3676ee9 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -1661,11 +1661,11 @@ _mdnblocks(SMgrRelation reln, ForkNumber forknum, MdfdVec *seg)
 {
 	off_t		len;
 
-	len = FileSeek(seg->mdfd_vfd, 0L, SEEK_END);
+	len = FileSize(seg->mdfd_vfd);
 	if (len < 0)
 		ereport(ERROR,
 				(errcode_for_file_access(),
-				 errmsg("could not seek to end of file \"%s\": %m",
+				 errmsg("could not determine size of file \"%s\": %m",
 						FilePathName(seg->mdfd_vfd))));
 	/* note that this calculation will ignore any partial block at EOF */
 	return (BlockNumber) (len / BLCKSZ);
diff --git a/src/include/storage/fd.h b/src/include/storage/fd.h
index 8a4d07c..2fb8424 100644
--- a/src/include/storage/fd.h
+++ b/src/include/storage/fd.h
@@ -68,6 +68,7 @@ extern int	FileRead(File file, char *buffer, int amount);
 extern int	FileWrite(File file, char *buffer, int amount);
 extern int	FileSync(File file);
 extern off_t FileSeek(File file, off_t offset, int whence);
+extern off_t FileSize(File file);
 extern int	FileTruncate(File file, off_t offset);
 extern char *FilePathName(File file);
 
