* already valid.)
         */
        if (!isLocalBuf)
-           LWLockAcquire(BufferDescriptorGetContentLock(bufHdr), LW_EXCLUSIVE);
+           LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE);
 
        /* Set BM_VALID, terminate IO, and wake up any waiters */
        if (isLocalBuf)
        }
 
        if (lock)
-           LWLockAcquire(BufferDescriptorGetContentLock(buf_hdr), LW_EXCLUSIVE);
+           LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE);
 
        TerminateBufferIO(buf_hdr, false, BM_VALID, true, false);
    }
 }
 
 /*
- * BufferIsExclusiveLocked
+ * BufferIsLockedByMe
+ *
+ *      Checks if this backend has the buffer locked in any mode.
+ *
+ * Buffer must be pinned.
+ */
+bool
+BufferIsLockedByMe(Buffer buffer)
+{
+   BufferDesc *bufHdr;
+
+   Assert(BufferIsPinned(buffer));
+
+   if (BufferIsLocal(buffer))
+   {
+       /* Content locks are not maintained for local buffers. */
+       return true;
+   }
+   else
+   {
+       bufHdr = GetBufferDescriptor(buffer - 1);
+       return LWLockHeldByMe(BufferDescriptorGetContentLock(bufHdr));
+   }
+}
+
+/*
+ * BufferIsLockedByMeInMode
  *
- *      Checks if buffer is exclusive-locked.
+ *      Checks if this backend has the buffer locked in the specified mode.
  *
  * Buffer must be pinned.
  */
 bool
-BufferIsExclusiveLocked(Buffer buffer)
+BufferIsLockedByMeInMode(Buffer buffer, int mode)
 {
    BufferDesc *bufHdr;
 
    }
    else
    {
+       LWLockMode  lw_mode;
+
+       switch (mode)
+       {
+           case BUFFER_LOCK_EXCLUSIVE:
+               lw_mode = LW_EXCLUSIVE;
+               break;
+           case BUFFER_LOCK_SHARE:
+               lw_mode = LW_SHARED;
+               break;
+           default:
+               pg_unreachable();
+       }
+
        bufHdr = GetBufferDescriptor(buffer - 1);
        return LWLockHeldByMeInMode(BufferDescriptorGetContentLock(bufHdr),
-                                   LW_EXCLUSIVE);
+                                   lw_mode);
    }
 }
 
    else
    {
        bufHdr = GetBufferDescriptor(buffer - 1);
-       Assert(LWLockHeldByMeInMode(BufferDescriptorGetContentLock(bufHdr),
-                                   LW_EXCLUSIVE));
+       Assert(BufferIsLockedByMeInMode(buffer, BUFFER_LOCK_EXCLUSIVE));
    }
 
    return pg_atomic_read_u32(&bufHdr->state) & BM_DIRTY;
    bufHdr = GetBufferDescriptor(buffer - 1);
 
    Assert(BufferIsPinned(buffer));
-   Assert(LWLockHeldByMeInMode(BufferDescriptorGetContentLock(bufHdr),
-                               LW_EXCLUSIVE));
+   Assert(BufferIsLockedByMeInMode(buffer, BUFFER_LOCK_EXCLUSIVE));
 
    old_buf_state = pg_atomic_read_u32(&bufHdr->state);
    for (;;)
         */
        VALGRIND_MAKE_MEM_NOACCESS(BufHdrGetBlock(buf), BLCKSZ);
 
-       /* I'd better not still hold the buffer content lock */
+       /*
+        * I'd better not still hold the buffer content lock. Can't use
+        * BufferIsLockedByMe(), as that asserts the buffer is pinned.
+        */
        Assert(!LWLockHeldByMe(BufferDescriptorGetContentLock(buf)));
 
        /*
 
    bufHdr = GetBufferDescriptor(buffer - 1);
 
-   Assert(LWLockHeldByMe(BufferDescriptorGetContentLock(bufHdr)));
+   Assert(BufferIsLockedByMe(buffer));
 
    FlushBuffer(bufHdr, NULL, IOOBJECT_RELATION, IOCONTEXT_NORMAL);
 }
 
    Assert(GetPrivateRefCount(buffer) > 0);
    /* here, either share or exclusive lock is OK */
-   Assert(LWLockHeldByMe(BufferDescriptorGetContentLock(bufHdr)));
+   Assert(BufferIsLockedByMe(buffer));
 
    /*
     * This routine might get called many times on the same page, if we are
    bufHdr = GetBufferDescriptor(buffer - 1);
 
    /* caller must hold exclusive lock on buffer */
-   Assert(LWLockHeldByMeInMode(BufferDescriptorGetContentLock(bufHdr),
-                               LW_EXCLUSIVE));
+   Assert(BufferIsLockedByMeInMode(buffer, BUFFER_LOCK_EXCLUSIVE));
 
    buf_state = LockBufHdr(bufHdr);