From 87a3023c60f4bab551441492652ef19371847fd3 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 30 May 2016 15:35:53 -0700
Subject: [PATCH] Move memory barrier in UnlockBufHdr to before releasing the
 lock.

This bug appears to have been introduced late in the development of
48354581a4 ("Allow Pin/UnpinBuffer to operate in a lockfree
manner.").

Found while debugging a bug which turned out to be independent of the
commit mentioned above.

Backpatch: -
---
 src/include/storage/buf_internals.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/include/storage/buf_internals.h b/src/include/storage/buf_internals.h
index c9cae956a54..511d7409e6e 100644
--- a/src/include/storage/buf_internals.h
+++ b/src/include/storage/buf_internals.h
@@ -242,8 +242,8 @@ extern PGDLLIMPORT LWLockMinimallyPadded *BufferIOLWLockArray;
 extern uint32 LockBufHdr(BufferDesc *desc);
 #define UnlockBufHdr(desc, s)	\
 	do {	\
-		pg_atomic_write_u32(&(desc)->state, (s) & (~BM_LOCKED)); \
 		pg_write_barrier(); \
+		pg_atomic_write_u32(&(desc)->state, (s) & (~BM_LOCKED)); \
 	} while (0)
 
 
-- 
GitLab