if (RelationNeedsWAL(index))
        {
                XLogRecPtr      recptr;
+               int                     flags;
 
                XLogBeginInsert();
                XLogRegisterData((char *) &xlrec, sizeof(xlrec));
                XLogRegisterData((char *) leafTuple, leafTuple->size);
 
-               XLogRegisterBuffer(0, current->buffer, REGBUF_STANDARD);
+               flags = REGBUF_STANDARD;
+               if (xlrec.newPage)
+                       flags |= REGBUF_WILL_INIT;
+               XLogRegisterBuffer(0, current->buffer, flags);
                if (xlrec.offnumParent != InvalidOffsetNumber)
                        XLogRegisterBuffer(1, parent->buffer, REGBUF_STANDARD);
 
                XLogRegisterData((char *) innerTuple, innerTuple->size);
                XLogRegisterData(leafdata, leafptr - leafdata);
 
-               flags = REGBUF_STANDARD;
-               if (xlrec.initSrc)
-                       flags |= REGBUF_WILL_INIT;
+               /* Old leaf page */
                if (BufferIsValid(saveCurrent.buffer))
+               {
+                       flags = REGBUF_STANDARD;
+                       if (xlrec.initSrc)
+                               flags |= REGBUF_WILL_INIT;
                        XLogRegisterBuffer(0, saveCurrent.buffer, flags);
+               }
 
+               /* New leaf page */
                if (BufferIsValid(newLeafBuffer))
                {
                        flags = REGBUF_STANDARD;
                                flags |= REGBUF_WILL_INIT;
                        XLogRegisterBuffer(1, newLeafBuffer, flags);
                }
-               XLogRegisterBuffer(2, current->buffer, REGBUF_STANDARD);
+
+               /* Inner page */
+               flags = REGBUF_STANDARD;
+               if (xlrec.initInner)
+                       flags |= REGBUF_WILL_INIT;
+               XLogRegisterBuffer(2, current->buffer, flags);
+
+               /* Parent page, if different from inner page */
                if (parent->buffer != InvalidBuffer)
                {
                        if (parent->buffer != current->buffer)
                if (RelationNeedsWAL(index))
                {
                        XLogRecPtr      recptr;
+                       int                     flags;
 
                        XLogBeginInsert();
 
                        /* orig page */
                        XLogRegisterBuffer(0, saveCurrent.buffer, REGBUF_STANDARD);
                        /* new page */
-                       XLogRegisterBuffer(1, current->buffer, REGBUF_STANDARD);
+                       flags = REGBUF_STANDARD;
+                       if (xlrec.newPage)
+                               flags |= REGBUF_WILL_INIT;
+                       XLogRegisterBuffer(1, current->buffer, flags);
                        /* parent page (if different from orig and new) */
                        if (xlrec.parentBlk == 2)
                                XLogRegisterBuffer(2, parent->buffer, REGBUF_STANDARD);
 
        ForkNumber      forknum;
        BlockNumber blkno;
        Page            page;
+       bool            zeromode;
+       bool            willinit;
 
        if (!XLogRecGetBlockTag(record, block_id, &rnode, &forknum, &blkno))
        {
                elog(PANIC, "failed to locate backup block with ID %d", block_id);
        }
 
+       /*
+        * Make sure that if the block is marked with WILL_INIT, the caller is
+        * going to initialize it. And vice versa.
+        */
+       zeromode = (mode == RBM_ZERO_AND_LOCK || mode == RBM_ZERO_AND_CLEANUP_LOCK);
+       willinit = (record->blocks[block_id].flags & BKPBLOCK_WILL_INIT) != 0;
+       if (willinit && !zeromode)
+               elog(PANIC, "block with WILL_INIT flag in WAL record must be zeroed by redo routine");
+       if (!willinit && zeromode)
+               elog(PANIC, "block to be initialized in redo routine must be marked with WILL_INIT flag in the WAL record");
+
        /* If it's a full-page image, restore it. */
        if (XLogRecHasBlockImage(record, block_id))
        {
        }
        else
        {
-               if ((record->blocks[block_id].flags & BKPBLOCK_WILL_INIT) != 0 &&
-                       mode != RBM_ZERO_AND_LOCK && mode != RBM_ZERO_AND_CLEANUP_LOCK)
-               {
-                       elog(PANIC, "block with WILL_INIT flag in WAL record must be zeroed by redo routine");
-               }
-
                *buf = XLogReadBufferExtended(rnode, forknum, blkno, mode);
                if (BufferIsValid(*buf))
                {