diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index b502086300038faa94c50e6ce4d56a8c9f080df4..9876f8b695bdb1143e37024dbc19748e4bf8ff5b 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.185 2005/03/27 23:52:58 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.186 2005/03/28 01:50:32 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -53,9 +53,6 @@
 #include "pgstat.h"
 
 
-/* comments are in heap_update */
-static xl_heaptid _locked_tuple_;
-static void _heap_unlock_tuple(void *data);
 static XLogRecPtr log_heap_update(Relation reln, Buffer oldbuf,
 	   ItemPointerData from, Buffer newbuf, HeapTuple newtup, bool move);
 
@@ -1620,15 +1617,7 @@ l2:
 	 * context lock (but not the pin!) on the old tuple's buffer while we
 	 * are off doing TOAST and/or table-file-extension work.  We must mark
 	 * the old tuple to show that it's already being updated, else other
-	 * processes may try to update it themselves. To avoid second XLOG log
-	 * record, we use xact mgr hook to unlock old tuple without reading
-	 * log if xact will abort before update is logged. In the event of
-	 * crash prio logging, TQUAL routines will see HEAP_XMAX_UNLOGGED
-	 * flag...
-	 *
-	 * NOTE: this trick is useless currently but saved for future when we'll
-	 * implement UNDO and will re-use transaction IDs after postmaster
-	 * startup.
+	 * processes may try to update it themselves.
 	 *
 	 * We need to invoke the toaster if there are already any out-of-line
 	 * toasted values present, or if the new tuple is over-threshold.
@@ -1642,15 +1631,10 @@ l2:
 
 	if (need_toast || newtupsize > pagefree)
 	{
-		_locked_tuple_.node = relation->rd_node;
-		_locked_tuple_.tid = oldtup.t_self;
-		XactPushRollback(_heap_unlock_tuple, (void *) &_locked_tuple_);
-
 		oldtup.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED |
 									   HEAP_XMAX_INVALID |
 									   HEAP_MARKED_FOR_UPDATE |
 									   HEAP_MOVED);
-		oldtup.t_data->t_infomask |= HEAP_XMAX_UNLOGGED;
 		HeapTupleHeaderSetXmax(oldtup.t_data, xid);
 		HeapTupleHeaderSetCmax(oldtup.t_data, cid);
 		already_marked = true;
@@ -1731,12 +1715,7 @@ l2:
 
 	RelationPutHeapTuple(relation, newbuf, newtup);		/* insert new tuple */
 
-	if (already_marked)
-	{
-		oldtup.t_data->t_infomask &= ~HEAP_XMAX_UNLOGGED;
-		XactPopRollback();
-	}
-	else
+	if (!already_marked)
 	{
 		oldtup.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED |
 									   HEAP_XMAX_INVALID |
@@ -2585,48 +2564,6 @@ newsame:;
 
 }
 
-static void
-_heap_unlock_tuple(void *data)
-{
-	TransactionId xid = GetCurrentTransactionId();
-	xl_heaptid *xltid = (xl_heaptid *) data;
-	Relation	reln = XLogOpenRelation(false, RM_HEAP_ID, xltid->node);
-	Buffer		buffer;
-	Page		page;
-	OffsetNumber offnum;
-	ItemId		lp;
-	HeapTupleHeader htup;
-
-	if (!RelationIsValid(reln))
-		elog(PANIC, "_heap_unlock_tuple: can't open relation");
-
-	buffer = XLogReadBuffer(false, reln,
-							ItemPointerGetBlockNumber(&(xltid->tid)));
-	if (!BufferIsValid(buffer))
-		elog(PANIC, "_heap_unlock_tuple: can't read buffer");
-
-	page = (Page) BufferGetPage(buffer);
-	if (PageIsNew((PageHeader) page))
-		elog(PANIC, "_heap_unlock_tuple: uninitialized page");
-
-	offnum = ItemPointerGetOffsetNumber(&(xltid->tid));
-	if (offnum > PageGetMaxOffsetNumber(page))
-		elog(PANIC, "_heap_unlock_tuple: invalid itemid");
-	lp = PageGetItemId(page, offnum);
-
-	if (!ItemIdIsUsed(lp) || ItemIdDeleted(lp))
-		elog(PANIC, "_heap_unlock_tuple: unused/deleted tuple in rollback");
-
-	htup = (HeapTupleHeader) PageGetItem(page, lp);
-
-	if (!TransactionIdEquals(HeapTupleHeaderGetXmax(htup), xid))
-		elog(PANIC, "_heap_unlock_tuple: invalid xmax in rollback");
-	htup->t_infomask &= ~HEAP_XMAX_UNLOGGED;
-	htup->t_infomask |= HEAP_XMAX_INVALID;
-	LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
-	WriteBuffer(buffer);
-}
-
 void
 heap_redo(XLogRecPtr lsn, XLogRecord *record)
 {
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index 5c84bb995542bee0802182caaa6d823686871db4..b5bb3d5b1fc40ad8d88c90a1c754e97d4f403313 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.197 2005/02/20 21:46:48 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.198 2005/03/28 01:50:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -196,9 +196,6 @@ typedef struct SubXactCallbackItem
 
 static SubXactCallbackItem *SubXact_callbacks = NULL;
 
-static void (*_RollbackFunc) (void *) = NULL;
-static void *_RollbackData = NULL;
-
 
 /* local function prototypes */
 static void AssignSubTransactionId(TransactionState s);
@@ -3902,21 +3899,3 @@ xact_desc(char *buf, uint8 xl_info, char *rec)
 	else
 		strcat(buf, "UNKNOWN");
 }
-
-void
-			XactPushRollback(void (*func) (void *), void *data)
-{
-#ifdef XLOG_II
-	if (_RollbackFunc != NULL)
-		elog(PANIC, "XactPushRollback: already installed");
-#endif
-
-	_RollbackFunc = func;
-	_RollbackData = data;
-}
-
-void
-XactPopRollback(void)
-{
-	_RollbackFunc = NULL;
-}
diff --git a/src/include/access/htup.h b/src/include/access/htup.h
index 51da662df1f5ec6659eaa46c3993b9a25372bde2..e57ce8a3cbefcbcf9a13a72e33e3079b6f579f79 100644
--- a/src/include/access/htup.h
+++ b/src/include/access/htup.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/access/htup.h,v 1.72 2004/12/31 22:03:21 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/access/htup.h,v 1.73 2005/03/28 01:50:34 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -152,9 +152,7 @@ typedef HeapTupleHeaderData *HeapTupleHeader;
 										 * attribute(s) */
 #define HEAP_HASEXTENDED		0x000C	/* the two above combined */
 #define HEAP_HASOID				0x0010	/* has an object-id field */
-/* 0x0020 and 0x0040 are unused */
-#define HEAP_XMAX_UNLOGGED		0x0080	/* to lock tuple for update
-										 * without logging */
+/* 0x0020, 0x0040 and 0x0080 are unused */
 #define HEAP_XMIN_COMMITTED		0x0100	/* t_xmin committed */
 #define HEAP_XMIN_INVALID		0x0200	/* t_xmin invalid/aborted */
 #define HEAP_XMAX_COMMITTED		0x0400	/* t_xmax committed */
diff --git a/src/include/access/xact.h b/src/include/access/xact.h
index 0039b5b12432d398be1b71e966d7992d0ae327a4..0d3a6383426a0809a7b9dc1300ec65cfef13cebe 100644
--- a/src/include/access/xact.h
+++ b/src/include/access/xact.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.74 2004/12/31 22:03:21 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.75 2005/03/28 01:50:34 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -145,9 +145,6 @@ extern void RecordTransactionCommit(void);
 
 extern int	xactGetCommittedChildren(TransactionId **ptr);
 
-extern void XactPushRollback(void (*func) (void *), void *data);
-extern void XactPopRollback(void);
-
 extern void xact_redo(XLogRecPtr lsn, XLogRecord *record);
 extern void xact_undo(XLogRecPtr lsn, XLogRecord *record);
 extern void xact_desc(char *buf, uint8 xl_info, char *rec);