@@ -646,7 +646,7 @@ static void CreateEndOfRecoveryRecord(void);
646646static void CheckPointGuts (XLogRecPtr checkPointRedo ,int flags );
647647static void KeepLogSeg (XLogRecPtr recptr ,XLogSegNo * logSegNo );
648648
649- static bool XLogCheckBuffer (XLogRecData * rdata ,bool doPageWrites ,
649+ static bool XLogCheckBuffer (XLogRecData * rdata ,bool holdsExclusiveLock ,
650650XLogRecPtr * lsn ,BkpBlock * bkpb );
651651static Buffer RestoreBackupBlockContents (XLogRecPtr lsn ,BkpBlock bkpb ,
652652char * blk ,bool get_cleanup_lock ,bool keep_buffer );
@@ -822,7 +822,7 @@ begin:;
822822{
823823/* OK, put it in this slot */
824824dtbuf [i ]= rdt -> buffer ;
825- if (XLogCheckBuffer (rdt ,doPageWrites ,
825+ if (doPageWrites && XLogCheckBuffer (rdt ,true ,
826826& (dtbuf_lsn [i ]),& (dtbuf_xlg [i ])))
827827{
828828dtbuf_bkp [i ]= true;
@@ -1243,23 +1243,25 @@ begin:;
12431243 * save the buffer's LSN at *lsn.
12441244 */
12451245static bool
1246- XLogCheckBuffer (XLogRecData * rdata ,bool doPageWrites ,
1246+ XLogCheckBuffer (XLogRecData * rdata ,bool holdsExclusiveLock ,
12471247XLogRecPtr * lsn ,BkpBlock * bkpb )
12481248{
12491249Page page ;
12501250
12511251page = BufferGetPage (rdata -> buffer );
12521252
12531253/*
1254- *XXX We assume page LSN is first data on *every* page that can be passed
1255- * to XLogInsert, whether itotherwise has the standard page layout or
1256- *not. We don't need the buffer header lock for PageGetLSNbecause we
1257- *have exclusive lock on the page and/or the relation.
1254+ * We assume page LSN is first data on *every* page that can be passed
1255+ * to XLogInsert, whether it has the standard page layout or not. We
1256+ * don't needto take the buffer header lock for PageGetLSNif we hold
1257+ *an exclusive lock on the page and/or the relation.
12581258 */
1259- * lsn = BufferGetLSNAtomic (rdata -> buffer );
1259+ if (holdsExclusiveLock )
1260+ * lsn = PageGetLSN (page );
1261+ else
1262+ * lsn = BufferGetLSNAtomic (rdata -> buffer );
12601263
1261- if (doPageWrites &&
1262- * lsn <=RedoRecPtr )
1264+ if (* lsn <=RedoRecPtr )
12631265{
12641266/*
12651267 * The page needs to be backed up, so set up *bkpb
@@ -7683,7 +7685,10 @@ XLogSaveBufferForHint(Buffer buffer)
76837685rdata [0 ].buffer = buffer ;
76847686rdata [0 ].buffer_std = true;
76857687
7686- if (XLogCheckBuffer (rdata , true,& lsn ,& bkpb ))
7688+ /*
7689+ * Check buffer while not holding an exclusive lock.
7690+ */
7691+ if (XLogCheckBuffer (rdata , false,& lsn ,& bkpb ))
76877692{
76887693char copied_buffer [BLCKSZ ];
76897694char * origdata = (char * )BufferGetBlock (buffer );