diff --git a/contrib/bloom/bloom.h b/contrib/bloom/bloom.h
index d5284f372536d1536abd6a4f437ffa1d4c01eb05..cbf2eb7892766fb5bb2479ad46ec0e1ced9cadb8 100644
--- a/contrib/bloom/bloom.h
+++ b/contrib/bloom/bloom.h
@@ -31,8 +31,13 @@
 /* Opaque for bloom pages */
 typedef struct BloomPageOpaqueData
 {
-	OffsetNumber maxoff;
-	uint16		flags;
+	OffsetNumber	maxoff;			/* number of index tuples on page */
+	uint16			flags;			/* see bit definitions below */
+	uint16			unused;			/* placeholder to force maxaligning of size
+									 * of BloomPageOpaqueData and to place
+									 * bloom_page_id exactly at the end of page
+									 */
+	uint16			bloom_page_id;	/* for identification of BLOOM indexes */
 }	BloomPageOpaqueData;
 
 typedef BloomPageOpaqueData *BloomPageOpaque;
@@ -41,6 +46,16 @@ typedef BloomPageOpaqueData *BloomPageOpaque;
 #define BLOOM_META		(1<<0)
 #define BLOOM_DELETED	(2<<0)
 
+/*
+ * The page ID is for the convenience of pg_filedump and similar utilities,
+ * which otherwise would have a hard time telling pages of different index
+ * types apart.  It should be the last 2 bytes on the page.  This is more or
+ * less "free" due to alignment considerations.
+ *
+ * See comments above GinPageOpaqueData.
+ */
+#define BLOOM_PAGE_ID		0xFF83
+
 /* Macros for accessing bloom page structures */
 #define BloomPageGetOpaque(page) ((BloomPageOpaque) PageGetSpecialPointer(page))
 #define BloomPageGetMaxOffset(page) (BloomPageGetOpaque(page)->maxoff)
diff --git a/contrib/bloom/blutils.c b/contrib/bloom/blutils.c
index 6c7dc1d07d191814d58853a6cef12988b35d1eeb..edfdfb934f64b39961ffc141c2b1a2ea4155c0f6 100644
--- a/contrib/bloom/blutils.c
+++ b/contrib/bloom/blutils.c
@@ -359,6 +359,7 @@ BloomInitPage(Page page, uint16 flags)
 	opaque = BloomPageGetOpaque(page);
 	memset(opaque, 0, sizeof(BloomPageOpaqueData));
 	opaque->flags = flags;
+	opaque->bloom_page_id = BLOOM_PAGE_ID;
 }
 
 /*