diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index d1479bbab77e13ef01377ead4e36034df0aa0007..901053f18392b067190a0fd65361f4b0396246cd 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.141 2005/02/26 18:43:33 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.142 2005/03/18 05:24:13 tgl Exp $
  *
  *
  *-------------------------------------------------------------------------
@@ -507,13 +507,14 @@ ShutdownPostgres(int code, Datum arg)
 	 * since that just raises the odds of failure --- but there's some
 	 * stuff we need to do.
 	 *
-	 * Release any LW locks and buffer context locks we might be holding.
-	 * This is a kluge to improve the odds that we won't get into a
-	 * self-made stuck-lock scenario while trying to shut down.
+	 * Release any LW locks, buffer content locks, and buffer pins we might be
+	 * holding.  This is a kluge to improve the odds that we won't get into a
+	 * self-made stuck-lock scenario while trying to shut down.  We *must*
+	 * release buffer pins to make it safe to do file deletion, since we
+	 * might have some pins on pages of the target files.
 	 */
 	LWLockReleaseAll();
-	AbortBufferIO();
-	UnlockBuffers();
+	AtProcExit_Buffers();
 
 	/*
 	 * In case a transaction is open, delete any files it created.	This