diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index eba9a4716d..2bbc5a92c7 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -3540,11 +3540,14 @@ MarkBufferDirtyHint(Buffer buffer, bool buffer_std)
 		 * before using PageGetLSN(), which is enforced in
 		 * BufferGetLSNAtomic().
 		 *
+		 * Do not let LSN go backwards. This might happen if a concurrent
+		 * backend generated the LSN later that we did but applied before us.
+		 *
 		 * If checksums are enabled, you might think we should reset the
 		 * checksum here. That will happen when the page is written sometime
 		 * later in this checkpoint cycle.
 		 */
-		if (!XLogRecPtrIsInvalid(lsn))
+		if (!XLogRecPtrIsInvalid(lsn) && lsn > PageGetLSN(page))
 			PageSetLSN(page, lsn);
 
 		buf_state |= BM_DIRTY | BM_JUST_DIRTIED;
