summary refs log tree commit diff
path: root/db2
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-09-05 01:43:20 +0000
committerUlrich Drepper <drepper@redhat.com>1997-09-05 01:43:20 +0000
commit26b4d7667169f8db26fd8194b3c498ec58e50f90 (patch)
tree491a6edd9fe8961fe781a50c39517dae8a35321d /db2
parent800d775e426b9c0af63f711b79b09bf540c97456 (diff)
downloadglibc-26b4d7667169f8db26fd8194b3c498ec58e50f90.tar.gz
glibc-26b4d7667169f8db26fd8194b3c498ec58e50f90.tar.xz
glibc-26b4d7667169f8db26fd8194b3c498ec58e50f90.zip
1997-09-05 03:15  Ulrich Drepper  <drepper@cygnus.com>

	* Makefile (subdirs): Reorganize order so that nss follows add-ons.
	* config.make.in (LDAP): Add.
	* configure.in: Prepare for ldap add-on.
	* shlib-versions: Add version numbers for ldap NSS module.
	* nss/Makefile: Add rules to build ldap NSS module.

	* db/btree/bt_page.c (__bt_free): Update meta data information.

	Update db from db-2.3.6.
	* db2/db.h: Updated.
	* db2/btree/bt_close.c: Updated.
	* db2/btree/bt_compare.c: Updated.
	* db2/btree/bt_conv.c: Updated.
	* db2/btree/bt_cursor.c: Updated.
	* db2/btree/bt_delete.c: Updated.
	* db2/btree/bt_put.c: Updated.
	* db2/btree/bt_rec.c: Updated.
	* db2/btree/bt_recno.c: Updated.
	* db2/btree/bt_search.c: Updated.
	* db2/btree/bt_split.c: Updated.
	* db2/btree/bt_stat.c: Updated.
	* db2/common/db_appinit.c: Updated.
	* db2/common/db_apprec.c: Updated.
	* db2/common/db_byteorder.c: Updated.
	* db2/common/db_err.c: Updated.
	* db2/common/db_region.c: Updated.
	* db2/db/db.c: Updated.
	* db2/db/db_conv.c: Updated.
	* db2/db/db_dup.c: Updated.
	* db2/db/db_pr.c: Updated.
	* db2/db/db_ret.c: Updated.
	* db2/db185/db185.c: Updated.
	* db2/dbm/dbm.c: Updated.
	* db2/hash/hash_dup.c: Updated.
	* db2/include/db_am.h: Updated.
	* db2/include/db_page.h: Updated.
	* db2/include/mp.h: Updated.
	* db2/include/queue.h: Updated.
	* db2/log/log.c: Updated.
	* db2/log/log_findckp.c: Updated.
	* db2/log/log_get.c: Updated.
	* db2/log/log_rec.c: Updated.
	* db2/mp/mp_bh.c: Updated.
	* db2/mp/mp_fopen.c: Updated.
	* db2/mp/mp_pr.c: Updated.
	* db2/mp/mp_sync.c: Updated.
	* db2/mutex/x86.gcc: Updated.
	* db2/os/db_os_dir.c: Updated.
	* db2/os/db_os_fid.c: Updated.
	* db2/progs/db_archive/db_archive.c: Updated.
	* db2/progs/db_checkpoint/db_checkpoint.c: Updated.
	* db2/progs/db_deadlock/db_deadlock.c: Updated.
	* db2/progs/db_dump/db_dump.c: Updated.
	* db2/progs/db_dump185/db_dump185.c: Updated.
	* db2/progs/db_load/db_load.c: Updated.
	* db2/progs/db_printlog/db_printlog.c: Updated.
	* db2/progs/db_recover/db_recover.c: Updated.
	* db2/progs/db_stat/db_stat.c: Updated.
	* db2/txn/txn.c: Updated.
	* db2/txn/txn_rec.c: Updated.

	* db2/Makefile: Add rule to build db_printlog.
	* db2/config.h: Don't include endian.h and don't define
	WORDS_BIGENDIAN.  Only define HAVE_ENDIAN_H.

	* elf/dl-open.c (_dl_open): Make thread-safe.
	* elf/dl-close.c (_dl_close): Likewise.
	* elf/dlclose.c: Pretty print.
	* elf/dl-version.c (make_string): Use __strdup not strdup.
	(find_needed): Don't use l_searchlist of _dl_loaded, use the
	l_next list.
	* elf/dl-deps.c (_dl_map_object_deps): Remove variable head.

	* manual/math.texi: Add note about == and != for FP values.
	* manual/message.texi: Mention problems with relative paths and
	binstextdomain.
	* manual/string.texi: Mark strdupa and strndupa correctly as macros.

	* sunrpc/Makefile (CFLAGS-xkey_prot.c): Define to prevent warnings.
	* sunrpc/rpc_cout.c: Avoid needless races around return value.

	* sysdeps/generic/stpcpy.c: Include <config.h> if wanted.

	Update from tzdata-1997h.
	* time/africa: Updated.
	* time/europe: Updated.
	* time/iso3166.tab: Updated.
	* time/northamerica: Updated.
	* time/southamerica: Updated.
	* time/zone.tab: Updated.

1997-09-04 13:19  Richard Henderson  <rth@cygnus.com>

	* sysdeps/alpha/w_sqrt.S: Removed.
	* sysdeps/alpha/fpu/e_sqrt.c: New.  Obey -mieee and -mieee-with-inexact
	and build a version that is as fast as possible given the constraint.

1997-08-30  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* manual/maint.texi: Document some defaults for configuration
	parameters.

1997-09-04 15:57  Ulrich Drepper  <drepper@cygnus.com>

	* termios/cfsetspeed.c (cfsetspeed): Change return value to int.
	* termios/termios.h: Change prototype accordingly.
	Reported by Andreas Jaeger <aj@arthur.rhein-neckar.de>.

1997-07-26 14:42  H.J. Lu  <hjl@gnu.ai.mit.edu>

	* libio/stdfiles.c (_libio_using_thunks): Define if
	_G_USING_THUNKS is defined.

	* libio/_G_config.h: Moved to ...
	* sysdeps/generic/_G_config.h: ...here.

	* sysdeps/unix/sysv/linux/_G_config.h: New,
	Add vtable thunks support.

1997-09-02  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/m68k/Makefile (pic-ccflag): Override it for more
	efficient code (together with a change in gcc).

	* Makeconfig (pic-ccflag): New variable.
	(CFLAGS-.os): Use it instead of hardcoding -fPIC.

1997-09-02  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/m68k/dl-machine.h (elf_machine_load_address): Use
	_dl_start instead of a local label, to avoid getting an unreadable
	label name.

1997-09-02  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* nss/Makefile ($(objpfx)libnss_db.so): Use $(dbobjdir) to find
	libdb.so.

	* Makeconfig (dbobjdir): Use db2.

1997-08-31  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* manual/maint.texi (Porting to Unix): Update description of the
	implementation of Unix system calls.
	(Contributors): Use real umlaut in tege's name.

1997-08-30  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/libm-ieee754/w_gamma.c: Make compilable with
	_IEEE_LIBM.
	* sysdeps/libm-ieee754/w_gammaf.c: Likewise.
	* sysdeps/libm-ieee754/w_gammal.c: Likewise.
Diffstat (limited to 'db2')
-rw-r--r--db2/Makefile4
-rw-r--r--db2/btree/bt_close.c10
-rw-r--r--db2/btree/bt_compare.c6
-rw-r--r--db2/btree/bt_conv.c18
-rw-r--r--db2/btree/bt_cursor.c26
-rw-r--r--db2/btree/bt_delete.c17
-rw-r--r--db2/btree/bt_put.c32
-rw-r--r--db2/btree/bt_rec.c8
-rw-r--r--db2/btree/bt_recno.c6
-rw-r--r--db2/btree/bt_search.c8
-rw-r--r--db2/btree/bt_split.c61
-rw-r--r--db2/btree/bt_stat.c15
-rw-r--r--db2/common/db_appinit.c62
-rw-r--r--db2/common/db_apprec.c98
-rw-r--r--db2/common/db_byteorder.c7
-rw-r--r--db2/common/db_err.c8
-rw-r--r--db2/common/db_region.c4
-rw-r--r--db2/config.h8
-rw-r--r--db2/db.h9
-rw-r--r--db2/db/db.c24
-rw-r--r--db2/db/db_conv.c6
-rw-r--r--db2/db/db_dup.c16
-rw-r--r--db2/db/db_pr.c40
-rw-r--r--db2/db/db_ret.c4
-rw-r--r--db2/db185/db185.c3
-rw-r--r--db2/dbm/dbm.c14
-rw-r--r--db2/hash/hash_dup.c5
-rw-r--r--db2/include/db_am.h4
-rw-r--r--db2/include/db_page.h31
-rw-r--r--db2/include/mp.h11
-rw-r--r--db2/log/log.c2
-rw-r--r--db2/log/log_findckp.c4
-rw-r--r--db2/log/log_get.c4
-rw-r--r--db2/log/log_rec.c16
-rw-r--r--db2/mp/mp_bh.c59
-rw-r--r--db2/mp/mp_fopen.c4
-rw-r--r--db2/mp/mp_pr.c2
-rw-r--r--db2/mp/mp_sync.c14
-rw-r--r--db2/mutex/x86.gcc4
-rw-r--r--db2/os/db_os_dir.c6
-rw-r--r--db2/os/db_os_fid.c4
-rw-r--r--db2/progs/db_archive/db_archive.c7
-rw-r--r--db2/progs/db_checkpoint/db_checkpoint.c7
-rw-r--r--db2/progs/db_deadlock/db_deadlock.c9
-rw-r--r--db2/progs/db_dump/db_dump.c9
-rw-r--r--db2/progs/db_dump185/db_dump185.c19
-rw-r--r--db2/progs/db_load/db_load.c11
-rw-r--r--db2/progs/db_printlog/db_printlog.c8
-rw-r--r--db2/progs/db_recover/db_recover.c9
-rw-r--r--db2/progs/db_stat/db_stat.c11
-rw-r--r--db2/txn/txn.c18
-rw-r--r--db2/txn/txn_rec.c4
52 files changed, 451 insertions, 345 deletions
diff --git a/db2/Makefile b/db2/Makefile
index a7521b6580..a75dc5aef1 100644
--- a/db2/Makefile
+++ b/db2/Makefile
@@ -19,7 +19,7 @@
 #
 #	Sub-makefile for libdb.
 #
-#	The code is lifted straight from the db 2.3.4 distribution
+#	The code is lifted straight from the db 2.3.6 distribution
 #	with minimal changes.
 #
 
@@ -90,6 +90,7 @@ $(objpfx)db_checkpoint: $(objpfx)libdb.so$(libdb.so-version)
 $(objpfx)db_deadlock: $(objpfx)libdb.so$(libdb.so-version)
 $(objpfx)db_dump: $(objpfx)libdb.so$(libdb.so-version)
 $(objpfx)db_load: $(objpfx)libdb.so$(libdb.so-version)
+$(objpfx)db_printlog: $(objpfx)libdb.so$(libdb.so-version)
 $(objpfx)db_recover: $(objpfx)libdb.so$(libdb.so-version)
 $(objpfx)db_stat: $(objpfx)libdb.so$(libdb.so-version)
 else
@@ -100,6 +101,7 @@ $(objpfx)db_checkpoint: $(objpfx)libdb.a
 $(objpfx)db_deadlock: $(objpfx)libdb.a
 $(objpfx)db_dump: $(objpfx)libdb.a
 $(objpfx)db_load: $(objpfx)libdb.a
+$(objpfx)db_printlog: $(objpfx)libdb.a
 $(objpfx)db_recover: $(objpfx)libdb.a
 $(objpfx)db_stat: $(objpfx)libdb.a
 endif
diff --git a/db2/btree/bt_close.c b/db2/btree/bt_close.c
index 4e80634e86..7044599dd2 100644
--- a/db2/btree/bt_close.c
+++ b/db2/btree/bt_close.c
@@ -47,7 +47,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)bt_close.c	10.22 (Sleepycat) 8/23/97";
+static const char sccsid[] = "@(#)bt_close.c	10.23 (Sleepycat) 9/2/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -157,14 +157,12 @@ __bam_upstat(dbp)
 	if (F_ISSET(dbp, DB_AM_INMEM | DB_AM_RDONLY))
 		return;
 
-	/* Lock the page. */
-	if (__bam_lget(dbp, 0, pgno, DB_LOCK_WRITE, &mlock) != 0)
-		return;
-
 	flags = 0;
 	pgno = PGNO_METADATA;
 
-	/* Get the page. */
+	/* Lock and retrieve the page. */
+	if (__bam_lget(dbp, 0, pgno, DB_LOCK_WRITE, &mlock) != 0)
+		return;
 	if (__bam_pget(dbp, (PAGE **)&meta, &pgno, 0) == 0) {
 		/* Log the change. */
 		if (DB_LOGGING(dbp) &&
diff --git a/db2/btree/bt_compare.c b/db2/btree/bt_compare.c
index e802fd24ab..a68b1fa891 100644
--- a/db2/btree/bt_compare.c
+++ b/db2/btree/bt_compare.c
@@ -47,7 +47,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)bt_compare.c	10.3 (Sleepycat) 7/19/97";
+static const char sccsid[] = "@(#)bt_compare.c	10.4 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -103,7 +103,7 @@ __bam_cmp(dbp, k1, e)
 	bo = NULL;
 	if (TYPE(h) == P_LBTREE) {
 		bk = GET_BKEYDATA(h, e->indx);
-		if (bk->type == B_OVERFLOW)
+		if (B_TYPE(bk->type) == B_OVERFLOW)
 			bo = (BOVERFLOW *)bk;
 		else {
 			memset(&k2, 0, sizeof(k2));
@@ -112,7 +112,7 @@ __bam_cmp(dbp, k1, e)
 		}
 	} else {
 		bi = GET_BINTERNAL(h, e->indx);
-		if (bi->type == B_OVERFLOW)
+		if (B_TYPE(bi->type) == B_OVERFLOW)
 			bo = (BOVERFLOW *)(bi->data);
 		else {
 			memset(&k2, 0, sizeof(k2));
diff --git a/db2/btree/bt_conv.c b/db2/btree/bt_conv.c
index 537e2f98ec..c9d5d1bc3e 100644
--- a/db2/btree/bt_conv.c
+++ b/db2/btree/bt_conv.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)bt_conv.c	10.3 (Sleepycat) 8/9/97";
+static const char sccsid[] = "@(#)bt_conv.c	10.4 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -69,6 +69,8 @@ __bam_mswap(pg)
 	u_int8_t *p;
 
 	p = (u_int8_t *)pg;
+
+	/* Swap the meta-data information. */
 	SWAP32(p);		/* lsn.file */
 	SWAP32(p);		/* lsn.offset */
 	SWAP32(p);		/* pgno */
@@ -79,5 +81,19 @@ __bam_mswap(pg)
 	SWAP32(p);		/* minkey */
 	SWAP32(p);		/* free */
 	SWAP32(p);		/* flags */
+
+	/* Swap the statistics. */
+	p = (u_int8_t *)&((BTMETA *)pg)->stat;
+	SWAP32(p);		/* bt_freed */
+	SWAP32(p);		/* bt_pfxsaved */
+	SWAP32(p);		/* bt_split */
+	SWAP32(p);		/* bt_rootsplit */
+	SWAP32(p);		/* bt_fastsplit */
+	SWAP32(p);		/* bt_added */
+	SWAP32(p);		/* bt_deleted */
+	SWAP32(p);		/* bt_get */
+	SWAP32(p);		/* bt_cache_hit */
+	SWAP32(p);		/* bt_cache_miss */
+
 	return (0);
 }
diff --git a/db2/btree/bt_cursor.c b/db2/btree/bt_cursor.c
index 592ec9b3ff..efae556030 100644
--- a/db2/btree/bt_cursor.c
+++ b/db2/btree/bt_cursor.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)bt_cursor.c	10.26 (Sleepycat) 8/24/97";
+static const char sccsid[] = "@(#)bt_cursor.c	10.27 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -201,9 +201,9 @@ __bam_c_del(dbc, flags)
 
 	/* Set the intent-to-delete flag on the page and in all cursors. */
 	if (cp->dpgno == PGNO_INVALID)
-		GET_BKEYDATA(h, indx + O_INDX)->deleted = 1;
+		B_DSET(GET_BKEYDATA(h, indx + O_INDX)->type);
 	else
-		GET_BKEYDATA(h, indx)->deleted = 1;
+		B_DSET(GET_BKEYDATA(h, indx)->type);
 	(void)__bam_ca_delete(dbp, pgno, indx, NULL);
 
 	ret = memp_fput(dbp->mpf, h, DB_MPOOL_DIRTY);
@@ -643,7 +643,7 @@ __bam_c_first(dbp, cp)
 
 	/* If it's an empty page or a deleted record, go to the next one. */
 	if (NUM_ENT(cp->page) == 0 ||
-	    GET_BKEYDATA(cp->page, cp->indx + O_INDX)->deleted)
+	    B_DISSET(GET_BKEYDATA(cp->page, cp->indx + O_INDX)->type))
 		if ((ret = __bam_c_next(dbp, cp, 0)) != 0)
 			return (ret);
 
@@ -653,7 +653,7 @@ __bam_c_first(dbp, cp)
 
 	/* If it's a deleted record, go to the next one. */
 	if (cp->dpgno != PGNO_INVALID &&
-	    GET_BKEYDATA(cp->page, cp->dindx)->deleted)
+	    B_DISSET(GET_BKEYDATA(cp->page, cp->dindx)->type))
 		if ((ret = __bam_c_next(dbp, cp, 0)) != 0)
 			return (ret);
 	return (0);
@@ -694,7 +694,7 @@ __bam_c_last(dbp, cp)
 
 	/* If it's an empty page or a deleted record, go to the previous one. */
 	if (NUM_ENT(cp->page) == 0 ||
-	    GET_BKEYDATA(cp->page, cp->indx + O_INDX)->deleted)
+	    B_DISSET(GET_BKEYDATA(cp->page, cp->indx + O_INDX)->type))
 		if ((ret = __bam_c_prev(dbp, cp)) != 0)
 			return (ret);
 
@@ -704,7 +704,7 @@ __bam_c_last(dbp, cp)
 
 	/* If it's a deleted record, go to the previous one. */
 	if (cp->dpgno != PGNO_INVALID &&
-	    GET_BKEYDATA(cp->page, cp->dindx)->deleted)
+	    B_DISSET(GET_BKEYDATA(cp->page, cp->dindx)->type))
 		if ((ret = __bam_c_prev(dbp, cp)) != 0)
 			return (ret);
 	return (0);
@@ -793,9 +793,9 @@ __bam_c_next(dbp, cp, initial_move)
 		/* Ignore deleted records. */
 		if (dbp->type == DB_BTREE &&
 		    ((cp->dpgno == PGNO_INVALID &&
-		    GET_BKEYDATA(cp->page, indx + O_INDX)->deleted) ||
+		    B_DISSET(GET_BKEYDATA(cp->page, indx + O_INDX)->type)) ||
 		    (cp->dpgno != PGNO_INVALID &&
-		    GET_BKEYDATA(cp->page, indx)->deleted))) {
+		    B_DISSET(GET_BKEYDATA(cp->page, indx)->type)))) {
 			indx += adjust;
 			continue;
 		}
@@ -908,9 +908,9 @@ __bam_c_prev(dbp, cp)
 		indx -= adjust;
 		if (dbp->type == DB_BTREE &&
 		    ((cp->dpgno == PGNO_INVALID &&
-		    GET_BKEYDATA(cp->page, indx + O_INDX)->deleted) ||
+		    B_DISSET(GET_BKEYDATA(cp->page, indx + O_INDX)->type)) ||
 		    (cp->dpgno != PGNO_INVALID &&
-		    GET_BKEYDATA(cp->page, indx)->deleted)))
+		    B_DISSET(GET_BKEYDATA(cp->page, indx)->type))))
 			continue;
 
 		/*
@@ -997,7 +997,7 @@ __bam_c_search(dbp, cp, key, flags, isrecno, exactp)
 
 	/* If it's a deleted record, go to the next or previous one. */
 	if (cp->dpgno != PGNO_INVALID &&
-	    GET_BKEYDATA(cp->page, cp->dindx)->deleted)
+	    B_DISSET(GET_BKEYDATA(cp->page, cp->dindx)->type))
 		if (flags == S_KEYLAST) {
 			if ((ret = __bam_c_prev(dbp, cp)) != 0)
 				return (ret);
@@ -1027,7 +1027,7 @@ __bam_ovfl_chk(dbp, cp, indx, to_end)
 
 	/* Check for an overflow entry. */
 	bo = GET_BOVERFLOW(cp->page, indx);
-	if (bo->type != B_DUPLICATE)
+	if (B_TYPE(bo->type) != B_DUPLICATE)
 		return (0);
 
 	/*
diff --git a/db2/btree/bt_delete.c b/db2/btree/bt_delete.c
index e7ec4dfe3e..98929540e4 100644
--- a/db2/btree/bt_delete.c
+++ b/db2/btree/bt_delete.c
@@ -47,7 +47,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)bt_delete.c	10.18 (Sleepycat) 8/24/97";
+static const char sccsid[] = "@(#)bt_delete.c	10.21 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -107,7 +107,7 @@ __bam_delete(argdbp, txn, key, flags)
 			break;
 	for (; cnt > 0; --cnt, ++t->lstat.bt_deleted)
 		if (__bam_ca_delete(dbp, h->pgno, indx, NULL) != 0) {
-			GET_BKEYDATA(h, indx + O_INDX)->deleted = 1;
+			B_DSET(GET_BKEYDATA(h, indx + O_INDX)->type);
 			indx += P_INDX;
 		} else if ((ret = __bam_ditem(dbp, h, indx)) != 0 ||
 		    (ret = __bam_ditem(dbp, h, indx)) != 0)
@@ -180,7 +180,7 @@ __ram_delete(argdbp, txn, key, flags)
 	stack = 1;
 
 	/* If the record has already been deleted, we couldn't have found it. */
-	if (GET_BKEYDATA(h, indx)->deleted) {
+	if (B_DISSET(GET_BKEYDATA(h, indx)->type)) {
 		ret = DB_KEYEMPTY;
 		goto done;
 	}
@@ -193,14 +193,13 @@ __ram_delete(argdbp, txn, key, flags)
 		if ((ret = __bam_ditem(dbp, h, indx)) != 0)
 			goto err;
 
-		bk.deleted = 1;
-		bk.type = B_KEYDATA;
+		B_TSET(bk.type, B_KEYDATA, 1);
 		bk.len = 0;
 		memset(&hdr, 0, sizeof(hdr));
 		hdr.data = &bk;
 		hdr.size = SSZA(BKEYDATA, data);
 		memset(&data, 0, sizeof(data));
-		data.data = (char *) "";
+		data.data = (char *)"";
 		data.size = 0;
 		if ((ret = __db_pitem(dbp,
 		    h, indx, BKEYDATA_SIZE(0), &hdr, &data)) != 0)
@@ -263,7 +262,7 @@ __bam_ditem(dbp, h, indx)
 	switch (TYPE(h)) {
 	case P_IBTREE:
 		bi = GET_BINTERNAL(h, indx);
-		switch (bi->type) {
+		switch (B_TYPE(bi->type)) {
 		case B_DUPLICATE:
 		case B_OVERFLOW:
 			nbytes = BINTERNAL_SIZE(bi->len);
@@ -298,14 +297,14 @@ __bam_ditem(dbp, h, indx)
 		/* FALLTHROUGH */
 	case P_LRECNO:
 		bk = GET_BKEYDATA(h, indx);
-		switch (bk->type) {
+		switch (B_TYPE(bk->type)) {
 		case B_DUPLICATE:
 		case B_OVERFLOW:
 			nbytes = BOVERFLOW_SIZE;
 
 offpage:		/* Delete duplicate/offpage chains. */
 			bo = GET_BOVERFLOW(h, indx);
-			if (bo->type == B_DUPLICATE) {
+			if (B_TYPE(bo->type) == B_DUPLICATE) {
 				if ((ret =
 				    __db_ddup(dbp, bo->pgno, __bam_free)) != 0)
 					return (ret);
diff --git a/db2/btree/bt_put.c b/db2/btree/bt_put.c
index 632c3d185b..0f0b1e7126 100644
--- a/db2/btree/bt_put.c
+++ b/db2/btree/bt_put.c
@@ -47,7 +47,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)bt_put.c	10.23 (Sleepycat) 8/22/97";
+static const char sccsid[] = "@(#)bt_put.c	10.24 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -120,7 +120,7 @@ retry:	/*
 	 */
 	replace = 0;
 	if (exact && flags == DB_NOOVERWRITE) {
-		if (!GET_BKEYDATA(h, indx + O_INDX)->deleted) {
+		if (!B_DISSET(GET_BKEYDATA(h, indx + O_INDX)->type)) {
 			ret = DB_KEYEXIST;
 			goto err;
 		}
@@ -436,16 +436,14 @@ __bam_iitem(dbp, hp, indxp, key, data, op, flags)
 	 */
 	bigkey = bigdata = 0;
 	if (LF_ISSET(BI_NEWKEY) && key->size > t->bt_ovflsize) {
-		kbo.deleted = 0;
-		kbo.type = B_OVERFLOW;
+		B_TSET(kbo.type, B_OVERFLOW, 0);
 		kbo.tlen = key->size;
 		if ((ret = __db_poff(dbp, key, &kbo.pgno, __bam_new)) != 0)
 			goto err;
 		bigkey = 1;
 	}
 	if (data->size > t->bt_ovflsize) {
-		dbo.deleted = 0;
-		dbo.type = B_OVERFLOW;
+		B_TSET(dbo.type, B_OVERFLOW, 0);
 		dbo.tlen = data->size;
 		if ((ret = __db_poff(dbp, data, &dbo.pgno, __bam_new)) != 0)
 			goto err;
@@ -472,7 +470,7 @@ __bam_iitem(dbp, hp, indxp, key, data, op, flags)
 		if (op == DB_CURRENT) {
 			bk = GET_BKEYDATA(h,
 			    indx + (TYPE(h) == P_LBTREE ? O_INDX : 0));
-			if (bk->type == B_OVERFLOW)
+			if (B_TYPE(bk->type) == B_OVERFLOW)
 				have_bytes = BOVERFLOW_PSIZE;
 			else
 				have_bytes = BKEYDATA_PSIZE(bk->len);
@@ -492,7 +490,7 @@ __bam_iitem(dbp, hp, indxp, key, data, op, flags)
 		 * alignment) and do a delete/insert otherwise.
 		 */
 		if (op == DB_CURRENT && !bigdata &&
-		    bk->type == B_KEYDATA && have_bytes == need_bytes)
+		    B_TYPE(bk->type) == B_KEYDATA && have_bytes == need_bytes)
 			dcopy = 1;
 		if (have_bytes < need_bytes)
 			needed += need_bytes - have_bytes;
@@ -622,9 +620,8 @@ __bam_iitem(dbp, hp, indxp, key, data, op, flags)
 		__data.size = data->size;
 
 		if (LF_ISSET(BI_DELETED)) {
+			B_TSET(__bk.type, B_KEYDATA, 1);
 			__bk.len = __data.size;
-			__bk.deleted = 1;
-			__bk.type = B_KEYDATA;
 			__hdr.data = &__bk;
 			__hdr.size = SSZA(BKEYDATA, data);
 			ret = __db_pitem(dbp, h, indx,
@@ -687,10 +684,10 @@ __bam_ndup(dbp, h, indx)
 		if (indx >= NUM_ENT(h) || h->inp[first] != h->inp[indx])
 			break;
 		bk = GET_BKEYDATA(h, indx);
-		sz += bk->type == B_KEYDATA ?
+		sz += B_TYPE(bk->type) == B_KEYDATA ?
 		    BKEYDATA_PSIZE(bk->len) : BOVERFLOW_PSIZE;
 		bk = GET_BKEYDATA(h, indx + O_INDX);
-		sz += bk->type == B_KEYDATA ?
+		sz += B_TYPE(bk->type) == B_KEYDATA ?
 		    BKEYDATA_PSIZE(bk->len) : BOVERFLOW_PSIZE;
 	}
 
@@ -716,7 +713,7 @@ __bam_ndup(dbp, h, indx)
 		/* Copy the entry to the new page. */
 		bk = GET_BKEYDATA(h, indx);
 		hdr.data = bk;
-		hdr.size = bk->type == B_KEYDATA ?
+		hdr.size = B_TYPE(bk->type) == B_KEYDATA ?
 		    BKEYDATA_SIZE(bk->len) : BOVERFLOW_SIZE;
 		if ((ret =
 		    __db_pitem(dbp, cp, cpindx, hdr.size, &hdr, NULL)) != 0)
@@ -743,8 +740,7 @@ __bam_ndup(dbp, h, indx)
 	}
 
 	/* Put in a new data item that points to the duplicates page. */
-	bo.deleted = 0;
-	bo.type = B_DUPLICATE;
+	B_TSET(bo.type, B_DUPLICATE, 0);
 	bo.pgno = cp->pgno;
 	bo.tlen = 0;
 
@@ -828,14 +824,14 @@ __bam_partial(dbp, dbt, h, indx)
 	 */
 	if (indx < NUM_ENT(h)) {
 		bk = GET_BKEYDATA(h, indx + (TYPE(h) == P_LBTREE ? O_INDX : 0));
-		if (bk->type == B_OVERFLOW) {
+		if (B_TYPE(bk->type) == B_OVERFLOW) {
 			bo = (BOVERFLOW *)bk;
 			nbytes = bo->tlen;
 		} else
 			nbytes = bk->len;
 	} else {
 		bk = &tbk;
-		bk->type = B_KEYDATA;
+		B_TSET(bk->type, B_KEYDATA, 0);
 		nbytes = bk->len = 0;
 	}
 	nbytes += dbt->doff + dbt->size + dbt->dlen;
@@ -856,7 +852,7 @@ __bam_partial(dbp, dbt, h, indx)
 	memset(t->bt_rdata.data, 0, nbytes);
 
 	tlen = 0;
-	if (bk->type == B_OVERFLOW) {
+	if (B_TYPE(bk->type) == B_OVERFLOW) {
 		/* Take up to doff bytes from the record. */
 		memset(&copy, 0, sizeof(copy));
 		if ((ret = __db_goff(dbp, &copy, bo->tlen,
diff --git a/db2/btree/bt_rec.c b/db2/btree/bt_rec.c
index d4bc7f6824..bf48e01d54 100644
--- a/db2/btree/bt_rec.c
+++ b/db2/btree/bt_rec.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)bt_rec.c	10.11 (Sleepycat) 8/22/97";
+static const char sccsid[] = "@(#)bt_rec.c	10.13 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -60,7 +60,7 @@ __bam_pg_alloc_recover(logp, dbtp, lsnp, redo, info)
 	 * Fix up the allocated page.  If we're redoing the operation, we have
 	 * to get the page (creating it if it doesn't exist), and update its
 	 * LSN.  If we're undoing the operation, we have to reset the page's
-	 * LSN and put it on the free list.  
+	 * LSN and put it on the free list.
 	 *
 	 * Fix up the metadata page.  If we're redoing the operation, we have
 	 * to get the metadata page and update its LSN and its free pointer.
@@ -749,13 +749,13 @@ __bam_cdel_recover(logp, dbtp, lsnp, redo, info)
 	cmp_p = log_compare(&LSN(pagep), &argp->lsn);
 	if (cmp_p == 0 && redo) {
 		/* Need to redo update described. */
-		GET_BKEYDATA(pagep, argp->indx + O_INDX)->deleted = 1;
+		B_DSET(GET_BKEYDATA(pagep, argp->indx + O_INDX)->type);
 
 		LSN(pagep) = *lsnp;
 		modified = 1;
 	} else if (cmp_n == 0 && !redo) {
 		/* Need to undo update described. */
-		GET_BKEYDATA(pagep, argp->indx + O_INDX)->deleted = 0;
+		B_DCLR(GET_BKEYDATA(pagep, argp->indx + O_INDX)->type);
 
 		LSN(pagep) = argp->lsn;
 		modified = 1;
diff --git a/db2/btree/bt_recno.c b/db2/btree/bt_recno.c
index cd8872a064..42ef9cc30d 100644
--- a/db2/btree/bt_recno.c
+++ b/db2/btree/bt_recno.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)bt_recno.c	10.12 (Sleepycat) 8/25/97";
+static const char sccsid[] = "@(#)bt_recno.c	10.15 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -246,7 +246,7 @@ __ram_get(argdbp, txn, key, data, flags)
 	indx = t->bt_csp->indx;
 
 	/* If the record has already been deleted, we couldn't have found it. */
-	if (GET_BKEYDATA(h, indx)->deleted) {
+	if (B_DISSET(GET_BKEYDATA(h, indx)->type)) {
 		ret = DB_KEYEMPTY;
 		goto done;
 	}
@@ -981,7 +981,7 @@ __ram_writeback(dbp)
 				if ((ret =
 				    __db_write(fd, pad, rp->re_len, &nw)) != 0)
 					goto err;
-				if (nw != (ssize_t) rp->re_len) {
+				if (nw != (ssize_t)rp->re_len) {
 					ret = EIO;
 					goto err;
 				}
diff --git a/db2/btree/bt_search.c b/db2/btree/bt_search.c
index d5f20d4c61..fa3e018313 100644
--- a/db2/btree/bt_search.c
+++ b/db2/btree/bt_search.c
@@ -47,7 +47,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)bt_search.c	10.6 (Sleepycat) 8/22/97";
+static const char sccsid[] = "@(#)bt_search.c	10.7 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -258,17 +258,17 @@ match:	*exactp = 1;
 	 */
 	if (LF_ISSET(S_DELNO)) {
 		if (LF_ISSET(S_DUPLAST))
-			while (GET_BKEYDATA(h, indx + O_INDX)->deleted &&
+			while (B_DISSET(GET_BKEYDATA(h, indx + O_INDX)->type) &&
 			    indx > 0 &&
 			    h->inp[indx] == h->inp[indx - P_INDX])
 				indx -= P_INDX;
 		else
-			while (GET_BKEYDATA(h, indx + O_INDX)->deleted &&
+			while (B_DISSET(GET_BKEYDATA(h, indx + O_INDX)->type) &&
 			    indx < (db_indx_t)(NUM_ENT(h) - P_INDX) &&
 			    h->inp[indx] == h->inp[indx + P_INDX])
 				indx += P_INDX;
 
-		if (GET_BKEYDATA(h, indx + O_INDX)->deleted)
+		if (B_DISSET(GET_BKEYDATA(h, indx + O_INDX)->type))
 			goto notfound;
 	}
 
diff --git a/db2/btree/bt_split.c b/db2/btree/bt_split.c
index 89cfcb5a2e..25cfacc4d0 100644
--- a/db2/btree/bt_split.c
+++ b/db2/btree/bt_split.c
@@ -44,7 +44,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)bt_split.c	10.12 (Sleepycat) 8/24/97";
+static const char sccsid[] = "@(#)bt_split.c	10.14 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -394,8 +394,7 @@ __bam_broot(dbp, rootp, lp, rp)
 	 * level of the tree is never used, so it doesn't need to be filled in.
 	 */
 	bi.len = 0;
-	bi.deleted = 0;
-	bi.type = B_KEYDATA;
+	B_TSET(bi.type, B_KEYDATA, 0);
 	bi.pgno = lp->pgno;
 	if (F_ISSET(dbp, DB_BT_RECNUM)) {
 		bi.nrecs = __bam_total(lp);
@@ -405,7 +404,7 @@ __bam_broot(dbp, rootp, lp, rp)
 	hdr.data = &bi;
 	hdr.size = SSZA(BINTERNAL, data);
 	memset(&data, 0, sizeof(data));
-	data.data = (char *) "";
+	data.data = (char *)"";
 	data.size = 0;
 	if ((ret =
 	    __db_pitem(dbp, rootp, 0, BINTERNAL_SIZE(0), &hdr, &data)) != 0)
@@ -417,8 +416,7 @@ __bam_broot(dbp, rootp, lp, rp)
 		child_bi = GET_BINTERNAL(rp, 0);
 
 		bi.len = child_bi->len;
-		bi.deleted = 0;
-		bi.type = child_bi->type;
+		B_TSET(bi.type, child_bi->type, 0);
 		bi.pgno = rp->pgno;
 		if (F_ISSET(dbp, DB_BT_RECNUM)) {
 			bi.nrecs = __bam_total(rp);
@@ -433,18 +431,17 @@ __bam_broot(dbp, rootp, lp, rp)
 			return (ret);
 
 		/* Increment the overflow ref count. */
-		if (child_bi->type == B_OVERFLOW && (ret =
+		if (B_TYPE(child_bi->type) == B_OVERFLOW && (ret =
 		    __db_ioff(dbp, ((BOVERFLOW *)(child_bi->data))->pgno)) != 0)
 			return (ret);
 		break;
 	case P_LBTREE:
 		/* Copy the first key of the child page onto the root page. */
 		child_bk = GET_BKEYDATA(rp, 0);
-		switch (child_bk->type) {
+		switch (B_TYPE(child_bk->type)) {
 		case B_KEYDATA:
 			bi.len = child_bk->len;
-			bi.deleted = 0;
-			bi.type = child_bk->type;
+			B_TSET(bi.type, child_bk->type, 0);
 			bi.pgno = rp->pgno;
 			if (F_ISSET(dbp, DB_BT_RECNUM)) {
 				bi.nrecs = __bam_total(rp);
@@ -461,8 +458,7 @@ __bam_broot(dbp, rootp, lp, rp)
 		case B_DUPLICATE:
 		case B_OVERFLOW:
 			bi.len = BOVERFLOW_SIZE;
-			bi.deleted = 0;
-			bi.type = child_bk->type;
+			B_TSET(bi.type, child_bk->type, 0);
 			bi.pgno = rp->pgno;
 			if (F_ISSET(dbp, DB_BT_RECNUM)) {
 				bi.nrecs = __bam_total(rp);
@@ -477,7 +473,7 @@ __bam_broot(dbp, rootp, lp, rp)
 				return (ret);
 
 			/* Increment the overflow ref count. */
-			if (child_bk->type == B_OVERFLOW && (ret =
+			if (B_TYPE(child_bk->type) == B_OVERFLOW && (ret =
 			    __db_ioff(dbp, ((BOVERFLOW *)child_bk)->pgno)) != 0)
 				return (ret);
 			break;
@@ -594,8 +590,7 @@ __bam_pinsert(dbp, parent, lchild, rchild)
 
 		/* Add a new record for the right page. */
 		bi.len = child_bi->len;
-		bi.deleted = 0;
-		bi.type = child_bi->type;
+		B_TSET(bi.type, child_bi->type, 0);
 		bi.pgno = rchild->pgno;
 		bi.nrecs = nrecs;
 		memset(&hdr, 0, sizeof(hdr));
@@ -609,13 +604,13 @@ __bam_pinsert(dbp, parent, lchild, rchild)
 			return (ret);
 
 		/* Increment the overflow ref count. */
-		if (child_bi->type == B_OVERFLOW && (ret =
+		if (B_TYPE(child_bi->type) == B_OVERFLOW && (ret =
 		    __db_ioff(dbp, ((BOVERFLOW *)(child_bi->data))->pgno)) != 0)
 			return (ret);
 		break;
 	case P_LBTREE:
 		child_bk = GET_BKEYDATA(rchild, 0);
-		switch (child_bk->type) {
+		switch (B_TYPE(child_bk->type)) {
 		case B_KEYDATA:
 			nbytes = BINTERNAL_PSIZE(child_bk->len);
 			nksize = child_bk->len;
@@ -624,7 +619,7 @@ __bam_pinsert(dbp, parent, lchild, rchild)
 			if (ppage->prev_pgno == PGNO_INVALID && off <= 1)
 				goto noprefix;
 			tmp_bk = GET_BKEYDATA(lchild, NUM_ENT(lchild) - P_INDX);
-			if (tmp_bk->type != B_KEYDATA)
+			if (B_TYPE(tmp_bk->type) != B_KEYDATA)
 				goto noprefix;
 			memset(&a, 0, sizeof(a));
 			a.size = tmp_bk->len;
@@ -643,8 +638,7 @@ noprefix:			nksize = child_bk->len;
 				return (DB_NEEDSPLIT);
 
 			bi.len = nksize;
-			bi.deleted = 0;
-			bi.type = child_bk->type;
+			B_TSET(bi.type, child_bk->type, 0);
 			bi.pgno = rchild->pgno;
 			bi.nrecs = nrecs;
 			memset(&hdr, 0, sizeof(hdr));
@@ -665,8 +659,7 @@ noprefix:			nksize = child_bk->len;
 				return (DB_NEEDSPLIT);
 
 			bi.len = BOVERFLOW_SIZE;
-			bi.deleted = 0;
-			bi.type = child_bk->type;
+			B_TSET(bi.type, child_bk->type, 0);
 			bi.pgno = rchild->pgno;
 			bi.nrecs = nrecs;
 			memset(&hdr, 0, sizeof(hdr));
@@ -680,7 +673,7 @@ noprefix:			nksize = child_bk->len;
 				return (ret);
 
 			/* Increment the overflow ref count. */
-			if (child_bk->type == B_OVERFLOW && (ret =
+			if (B_TYPE(child_bk->type) == B_OVERFLOW && (ret =
 			    __db_ioff(dbp, ((BOVERFLOW *)child_bk)->pgno)) != 0)
 				return (ret);
 			break;
@@ -796,21 +789,21 @@ __bam_psplit(dbp, cp, lp, rp, cleft)
 	for (nbytes = 0, off = 0; off < top && nbytes < half; ++off)
 		switch (TYPE(pp)) {
 		case P_IBTREE:
-			if (GET_BINTERNAL(pp, off)->type == B_KEYDATA)
+			if (B_TYPE(GET_BINTERNAL(pp, off)->type) == B_KEYDATA)
 				nbytes +=
 				   BINTERNAL_SIZE(GET_BINTERNAL(pp, off)->len);
 			else
 				nbytes += BINTERNAL_SIZE(BOVERFLOW_SIZE);
 			break;
 		case P_LBTREE:
-			if (GET_BKEYDATA(pp, off)->type == B_KEYDATA)
+			if (B_TYPE(GET_BKEYDATA(pp, off)->type) == B_KEYDATA)
 				nbytes +=
 				    BKEYDATA_SIZE(GET_BKEYDATA(pp, off)->len);
 			else
 				nbytes += BOVERFLOW_SIZE;
 
 			++off;
-			if (GET_BKEYDATA(pp, off)->type == B_KEYDATA)
+			if (B_TYPE(GET_BKEYDATA(pp, off)->type) == B_KEYDATA)
 				nbytes +=
 				    BKEYDATA_SIZE(GET_BKEYDATA(pp, off)->len);
 			else
@@ -832,9 +825,9 @@ sort:	splitp = off;
 	 * it's a big key, try and find something close by that's not.
 	 */
 	if (TYPE(pp) == P_IBTREE)
-		isbigkey = GET_BINTERNAL(pp, off)->type != B_KEYDATA;
+		isbigkey = B_TYPE(GET_BINTERNAL(pp, off)->type) != B_KEYDATA;
 	else if (TYPE(pp) == P_LBTREE)
-		isbigkey = GET_BKEYDATA(pp, off)->type != B_KEYDATA;
+		isbigkey = B_TYPE(GET_BKEYDATA(pp, off)->type) != B_KEYDATA;
 	else
 		isbigkey = 0;
 	if (isbigkey)
@@ -842,8 +835,8 @@ sort:	splitp = off;
 			off = splitp + cnt * adjust;
 			if (off < (db_indx_t)NUM_ENT(pp) &&
 			    ((TYPE(pp) == P_IBTREE &&
-			    GET_BINTERNAL(pp, off)->type == B_KEYDATA) ||
-			    GET_BKEYDATA(pp, off)->type == B_KEYDATA)) {
+			    B_TYPE(GET_BINTERNAL(pp,off)->type) == B_KEYDATA) ||
+			    B_TYPE(GET_BKEYDATA(pp, off)->type) == B_KEYDATA)) {
 				splitp = off;
 				break;
 			}
@@ -851,8 +844,8 @@ sort:	splitp = off;
 				continue;
 			off = splitp - cnt * adjust;
 			if (TYPE(pp) == P_IBTREE ?
-			    GET_BINTERNAL(pp, off)->type == B_KEYDATA :
-			    GET_BKEYDATA(pp, off)->type == B_KEYDATA) {
+			    B_TYPE(GET_BINTERNAL(pp, off)->type) == B_KEYDATA :
+			    B_TYPE(GET_BKEYDATA(pp, off)->type) == B_KEYDATA) {
 				splitp = off;
 				break;
 			}
@@ -915,7 +908,7 @@ __bam_copy(dbp, pp, cp, nxt, stop)
 	for (dup = off = 0; nxt < stop; ++nxt, ++NUM_ENT(cp), ++off) {
 		switch (TYPE(pp)) {
 		case P_IBTREE:
-			if (GET_BINTERNAL(pp, nxt)->type == B_KEYDATA)
+			if (B_TYPE(GET_BINTERNAL(pp, nxt)->type) == B_KEYDATA)
 				nbytes =
 				    BINTERNAL_SIZE(GET_BINTERNAL(pp, nxt)->len);
 			else
@@ -933,7 +926,7 @@ __bam_copy(dbp, pp, cp, nxt, stop)
 			}
 			/* FALLTHROUGH */
 		case P_LRECNO:
-			if (GET_BKEYDATA(pp, nxt)->type == B_KEYDATA)
+			if (B_TYPE(GET_BKEYDATA(pp, nxt)->type) == B_KEYDATA)
 				nbytes =
 				    BKEYDATA_SIZE(GET_BKEYDATA(pp, nxt)->len);
 			else
diff --git a/db2/btree/bt_stat.c b/db2/btree/bt_stat.c
index ba71ea616d..ab3bc4c431 100644
--- a/db2/btree/bt_stat.c
+++ b/db2/btree/bt_stat.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)bt_stat.c	10.11 (Sleepycat) 8/19/97";
+static const char sccsid[] = "@(#)bt_stat.c	10.12 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -140,6 +140,11 @@ __bam_stat(argdbp, spp, db_malloc, flags)
 	(void)memp_fput(dbp->mpf, meta, 0);
 	(void)__BT_TLPUT(dbp, lock);
 
+	/* Determine the last page of the database. */
+	if ((ret = memp_fget(dbp->mpf, &lastpgno, DB_MPOOL_LAST, &h)) != 0)
+		goto err;
+	(void)memp_fput(dbp->mpf, h, 0);
+
 	/* Get the root page. */
 	pgno = PGNO_ROOT;
 	if ((ret = __bam_lget(dbp, 0, PGNO_ROOT, DB_LOCK_READ, &lock)) != 0)
@@ -152,13 +157,7 @@ __bam_stat(argdbp, spp, db_malloc, flags)
 	/* Get the levels from the root page. */
 	sp->bt_levels = h->level;
 
-	/*
-	 * Determine the last page of the database, then walk it, counting
-	 * things.
-	 */
-	if ((ret = memp_fget(dbp->mpf, &lastpgno, DB_MPOOL_LAST, &h)) != 0)
-		goto err;
-	(void)memp_fput(dbp->mpf, h, 0);
+	/* Walk the page list, counting things. */
 	for (;;) {
 		switch (TYPE(h)) {
 		case P_INVALID:
diff --git a/db2/common/db_appinit.c b/db2/common/db_appinit.c
index 01891c66a7..51d9262859 100644
--- a/db2/common/db_appinit.c
+++ b/db2/common/db_appinit.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)db_appinit.c	10.27 (Sleepycat) 8/23/97";
+static const char sccsid[] = "@(#)db_appinit.c	10.33 (Sleepycat) 8/28/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -43,7 +43,7 @@ static int __db_tmp_open __P((DB_ENV *, char *, int *));
  * db_version --
  *	Return verision information.
  */
-const char *
+char *
 db_version(majverp, minverp, patchp)
 	int *majverp, *minverp, *patchp;
 {
@@ -53,7 +53,7 @@ db_version(majverp, minverp, patchp)
 		*minverp = DB_VERSION_MINOR;
 	if (patchp != NULL)
 		*patchp = DB_VERSION_PATCH;
-	return (DB_VERSION_STRING);
+	return ((char *)DB_VERSION_STRING);
 }
 
 /*
@@ -68,7 +68,7 @@ db_appinit(db_home, db_config, dbenv, flags)
 	int flags;
 {
 	FILE *fp;
-	int i_lock, i_log, i_mpool, i_txn, ret;
+	int ret;
 	char *lp, **p, buf[MAXPATHLEN * 2];
 
 	/* Validate arguments. */
@@ -94,7 +94,6 @@ db_appinit(db_home, db_config, dbenv, flags)
 		return (__db_ferr(dbenv, "db_appinit", 1));
 
 	fp = NULL;
-	i_lock = i_log = i_mpool = i_txn = 0;
 
 	/* Set the database home. */
 	if ((ret = __db_home(dbenv, db_home, flags)) != 0)
@@ -117,6 +116,7 @@ db_appinit(db_home, db_config, dbenv, flags)
 					goto err;
 			}
 			(void)fclose(fp);
+			fp = NULL;
 		}
 	}
 
@@ -152,34 +152,22 @@ db_appinit(db_home, db_config, dbenv, flags)
 #define	DB_DEFPERM	(S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)
 
 	/* Initialize the subsystems. */
-	if (LF_ISSET(DB_INIT_LOCK)) {
-		if ((ret = lock_open(NULL,
-		    LF_ISSET(DB_CREATE | DB_THREAD),
-		    DB_DEFPERM, dbenv, &dbenv->lk_info)) != 0)
-			goto err;
-		i_lock = 1;
-	}
-	if (LF_ISSET(DB_INIT_LOG)) {
-		if ((ret = log_open(NULL,
-		    LF_ISSET(DB_CREATE | DB_THREAD),
-		    DB_DEFPERM, dbenv, &dbenv->lg_info)) != 0)
-			goto err;
-		i_log = 1;
-	}
-	if (LF_ISSET(DB_INIT_MPOOL)) {
-		if ((ret = memp_open(NULL,
+	if (LF_ISSET(DB_INIT_LOCK) && (ret = lock_open(NULL,
+	    LF_ISSET(DB_CREATE | DB_THREAD),
+	    DB_DEFPERM, dbenv, &dbenv->lk_info)) != 0)
+		goto err;
+	if (LF_ISSET(DB_INIT_LOG) && (ret = log_open(NULL,
+	    LF_ISSET(DB_CREATE | DB_THREAD),
+	    DB_DEFPERM, dbenv, &dbenv->lg_info)) != 0)
+		goto err;
+	if (LF_ISSET(DB_INIT_MPOOL) && (ret = memp_open(NULL,
 	    LF_ISSET(DB_CREATE | DB_MPOOL_PRIVATE | DB_NOMMAP | DB_THREAD),
-		    DB_DEFPERM, dbenv, &dbenv->mp_info)) != 0)
-			goto err;
-		i_mpool = 1;
-	}
-	if (LF_ISSET(DB_INIT_TXN)) {
-		if ((ret = txn_open(NULL,
-		    LF_ISSET(DB_CREATE | DB_THREAD | DB_TXN_NOSYNC),
-		    DB_DEFPERM, dbenv, &dbenv->tx_info)) != 0)
-			goto err;
-		i_txn = 1;
-	}
+	    DB_DEFPERM, dbenv, &dbenv->mp_info)) != 0)
+		goto err;
+	if (LF_ISSET(DB_INIT_TXN) && (ret = txn_open(NULL,
+	    LF_ISSET(DB_CREATE | DB_THREAD | DB_TXN_NOSYNC),
+	    DB_DEFPERM, dbenv, &dbenv->tx_info)) != 0)
+		goto err;
 
 	/* Initialize recovery. */
 	if (LF_ISSET(DB_INIT_TXN)) {
@@ -195,7 +183,7 @@ db_appinit(db_home, db_config, dbenv, flags)
 			goto err;
 	}
 
-	/* Now run recovery if necessary. */
+	/* Run recovery if necessary. */
 	if (LF_ISSET(DB_RECOVER | DB_RECOVER_FATAL) && (ret =
 	    __db_apprec(dbenv, LF_ISSET(DB_RECOVER | DB_RECOVER_FATAL))) != 0)
 		goto err;
@@ -204,14 +192,6 @@ db_appinit(db_home, db_config, dbenv, flags)
 
 err:	if (fp != NULL)
 		(void)fclose(fp);
-	if (i_lock)
-		(void)lock_close(dbenv->lk_info);
-	if (i_log)
-		(void)log_close(dbenv->lg_info);
-	if (i_mpool)
-		(void)memp_close(dbenv->mp_info);
-	if (i_txn)
-		(void)txn_close(dbenv->tx_info);
 
 	(void)db_appexit(dbenv);
 	return (ret);
diff --git a/db2/common/db_apprec.c b/db2/common/db_apprec.c
index b22b0c5e9a..2e94673731 100644
--- a/db2/common/db_apprec.c
+++ b/db2/common/db_apprec.c
@@ -11,7 +11,7 @@
 static const char copyright[] =
 "@(#) Copyright (c) 1997\n\
 	Sleepycat Software Inc.  All rights reserved.\n";
-static const char sccsid[] = "@(#)db_apprec.c	10.15 (Sleepycat) 7/27/97";
+static const char sccsid[] = "@(#)db_apprec.c	10.16 (Sleepycat) 8/27/97";
 #endif
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -19,6 +19,7 @@ static const char sccsid[] = "@(#)db_apprec.c	10.15 (Sleepycat) 7/27/97";
 
 #include <time.h>
 #include <string.h>
+#include <stdlib.h>
 #endif
 
 #include "db_int.h"
@@ -30,6 +31,12 @@ static const char sccsid[] = "@(#)db_apprec.c	10.15 (Sleepycat) 7/27/97";
 #include "txn.h"
 #include "common_ext.h"
 
+#define	FREE_DBT(L, D) {						\
+	if (F_ISSET((L), DB_AM_THREAD) && (D).data != NULL)		\
+		free((D).data);						\
+		(D).data = NULL;					\
+	}								\
+
 /*
  * __db_apprec --
  *	Perform recovery.
@@ -45,30 +52,34 @@ __db_apprec(dbenv, flags)
 	DB_LOG *lp;
 	DB_LSN ckp_lsn, first_lsn, lsn, tmp_lsn;
 	time_t now;
-	int first_flag, ret, tret;
+	int first_flag, ret;
 	void *txninfo;
 
-	ZERO_LSN(ckp_lsn);
-
 	/* Initialize the transaction list. */
 	if ((ret = __db_txnlist_init(&txninfo)) != 0)
 		return (ret);
 
 	/*
-	 * Read forward through the log opening the appropriate files
-	 * so that we can call recovery routines.  In general, we start
-	 * at the last checkpoint prior to the last checkpointed LSN.
-	 * For catastrophic recovery, we begin at the first LSN that
-	 * appears in any log file (log figures this out for us when
-	 * we pass it the DB_FIRST flag).
+	 * Read forward through the log, opening the appropriate files so that
+	 * we can call recovery routines.  In general, we start at the last
+	 * checkpoint prior to the last checkpointed LSN.  For catastrophic
+	 * recovery, we begin at the first LSN that appears in any log file
+	 * (log_get figures this out for us when we pass it the DB_FIRST flag).
 	 */
 	lp = dbenv->lg_info;
 	if (LF_ISSET(DB_RECOVER_FATAL))
 		first_flag = DB_FIRST;
-	else
-		first_flag = __log_findckp(lp, &lsn) != 0 ? DB_FIRST : DB_SET;
+	else {
+		if ((ret = __log_findckp(lp, &lsn)) == DB_NOTFOUND)
+			return (0);
+		first_flag = DB_SET;
+	}
 
+	/* If we're a threaded application, we have to allocate space. */
 	memset(&data, 0, sizeof(data));
+	if (F_ISSET(lp, DB_AM_THREAD))
+		F_SET(&data, DB_DBT_MALLOC);
+
 	if ((ret = log_get(lp, &lsn, &data, first_flag)) != 0) {
 		__db_err(dbenv, "Failure: unable to get log record");
 		if (first_flag == DB_SET)
@@ -80,35 +91,55 @@ __db_apprec(dbenv, flags)
 	}
 
 	first_lsn = lsn;
-	for (; ret == 0;
-	    ret = log_get(dbenv->lg_info, &lsn, &data, DB_NEXT))
-		if ((tret = __db_dispatch(lp,
-		    &data, &lsn, TXN_OPENFILES, txninfo)) < 0) {
-			ret = tret;
+	for (;;) {
+		ret = __db_dispatch(lp, &data, &lsn, TXN_OPENFILES, txninfo);
+		FREE_DBT(lp, data);
+		if (ret != 0 && ret != DB_TXN_CKP)
 			goto msgerr;
+		if ((ret =
+		    log_get(dbenv->lg_info, &lsn, &data, DB_NEXT)) != 0) {
+			if (ret != DB_NOTFOUND)
+				goto err;
+			break;
 		}
+	}
+	FREE_DBT(lp, data);
 
+	/*
+	 * Initialize the ckp_lsn to 0,0.  If we never find a valid
+	 * checkpoint in the log, then leaving ckp_lsn at 0,0 is correct.
+	 */
+	ZERO_LSN(ckp_lsn);
 	for (ret = log_get(lp, &lsn, &data, DB_LAST);
 	    ret == 0 && log_compare(&lsn, &first_lsn) > 0;
 	    ret = log_get(lp,&lsn, &data, DB_PREV)) {
 		tmp_lsn = lsn;
-		tret =
-		    __db_dispatch(lp, &data, &lsn, TXN_BACKWARD_ROLL, txninfo);
-		if (IS_ZERO_LSN(ckp_lsn) && tret > 0)
-			ckp_lsn = tmp_lsn;
-		if (tret < 0) {
-			ret = tret;
+		ret = __db_dispatch(lp,
+		    &data, &lsn, TXN_BACKWARD_ROLL, txninfo);
+		FREE_DBT(lp, data);
+		if (ret == DB_TXN_CKP) {
+			if (IS_ZERO_LSN(ckp_lsn))
+				ckp_lsn = tmp_lsn;
+			ret = 0;
+		} else if (ret != 0)
 			goto msgerr;
-		}
 	}
+	FREE_DBT(lp, data);
+	if (ret != 0 && ret != DB_NOTFOUND)
+		goto err;
 
 	for (ret = log_get(lp, &lsn, &data, DB_NEXT);
-	    ret == 0; ret = log_get(lp, &lsn, &data, DB_NEXT))
-		if ((tret = __db_dispatch(lp,
-		    &data, &lsn, TXN_FORWARD_ROLL, txninfo)) < 0) {
-			ret = tret;
+	    ret == 0; ret = log_get(lp, &lsn, &data, DB_NEXT)) {
+		ret = __db_dispatch(lp, &data, &lsn, TXN_FORWARD_ROLL, txninfo);
+		FREE_DBT(lp, data);
+		if (ret == DB_TXN_CKP)
+			ret = 0;
+		else if (ret != 0)
 			goto msgerr;
-		}
+	}
+	FREE_DBT(lp, data);
+	if (ret != DB_NOTFOUND)
+		goto err;
 
 	/* Now close all the db files that are open. */
 	__log_close_files(lp);
@@ -118,11 +149,11 @@ __db_apprec(dbenv, flags)
 	 * and the current time.  Then take a checkpoint.
 	 */
 	(void)time(&now);
-
 	dbenv->tx_info->region->last_txnid = ((__db_txnhead *)txninfo)->maxid;
 	dbenv->tx_info->region->last_ckp = ckp_lsn;
-	dbenv->tx_info->region->time_ckp = (u_int32_t) now;
-	txn_checkpoint(dbenv->tx_info, 0, 0);
+	dbenv->tx_info->region->time_ckp = (u_int32_t)now;
+	if ((ret = txn_checkpoint(dbenv->tx_info, 0, 0)) != 0)
+		goto err;
 
 	if (dbenv->db_verbose) {
 		__db_err(lp->dbenv, "Recovery complete at %s", ctime(&now));
@@ -139,5 +170,6 @@ __db_apprec(dbenv, flags)
 msgerr:	__db_err(dbenv, "Recovery function for LSN %lu %lu failed",
 	    (u_long)lsn.file, (u_long)lsn.offset);
 
-err:	return (ret);
+err:	FREE_DBT(lp, data);
+	return (ret);
 }
diff --git a/db2/common/db_byteorder.c b/db2/common/db_byteorder.c
index d49883e093..a8d7715455 100644
--- a/db2/common/db_byteorder.c
+++ b/db2/common/db_byteorder.c
@@ -17,6 +17,13 @@ static const char sccsid[] = "@(#)db_byteorder.c	10.3 (Sleepycat) 6/21/97";
 #include <errno.h>
 #endif
 
+#ifdef HAVE_ENDIAN_H
+# include <endian.h>
+# if BYTE_ORDER == BIG_ENDIAN
+#  define WORDS_BIGENDIAN 1
+# endif
+#endif
+
 #include "db_int.h"
 #include "common_ext.h"
 
diff --git a/db2/common/db_err.c b/db2/common/db_err.c
index 3dc4ca007d..f3e7b40448 100644
--- a/db2/common/db_err.c
+++ b/db2/common/db_err.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)db_err.c	10.16 (Sleepycat) 8/24/97";
+static const char sccsid[] = "@(#)db_err.c	10.18 (Sleepycat) 8/27/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -221,7 +221,7 @@ __db_panic(dbp)
  * __db_fchk --
  *	General flags checking routine.
  *
- * PUBLIC: int __db_fchk __P((DB_ENV *, char *, int, int));
+ * PUBLIC: int __db_fchk __P((DB_ENV *, const char *, int, int));
  */
 int
 __db_fchk(dbenv, name, flags, ok_flags)
@@ -237,7 +237,7 @@ __db_fchk(dbenv, name, flags, ok_flags)
  * __db_fcchk --
  *	General combination flags checking routine.
  *
- * PUBLIC: int __db_fcchk __P((DB_ENV *, char *, int, int, int));
+ * PUBLIC: int __db_fcchk __P((DB_ENV *, const char *, int, int, int));
  */
 int
 __db_fcchk(dbenv, name, flags, flag1, flag2)
@@ -521,7 +521,7 @@ __db_syncchk(dbp, flags)
  * __db_ferr --
  *	Common flag errors.
  *
- * PUBLIC: int __db_ferr __P((const DB_ENV *, char *, int));
+ * PUBLIC: int __db_ferr __P((const DB_ENV *, const char *, int));
  */
 int
 __db_ferr(dbenv, name, combo)
diff --git a/db2/common/db_region.c b/db2/common/db_region.c
index 51f8f4465c..86d79a8148 100644
--- a/db2/common/db_region.c
+++ b/db2/common/db_region.c
@@ -43,7 +43,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)db_region.c	10.12 (Sleepycat) 7/26/97";
+static const char sccsid[] = "@(#)db_region.c	10.13 (Sleepycat) 8/27/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -229,7 +229,7 @@ __db_ropen(dbenv, appname, path, file, flags, fdp, retp)
 		goto err2;
 
 	/* Check to make sure the first block has been written. */
-	if ((size_t) size1 < sizeof(RLAYOUT)) {
+	if ((size_t)size1 < sizeof(RLAYOUT)) {
 		ret = EAGAIN;
 		goto err2;
 	}
diff --git a/db2/config.h b/db2/config.h
index ed1246d0f4..27dbdaa439 100644
--- a/db2/config.h
+++ b/db2/config.h
@@ -2,7 +2,6 @@
 /* config.h.in.  Generated automatically from configure.in by autoheader.  */
 
 /* ...but edited by hand to be used in GNU libc.  */
-#include <endian.h>
 #include <sys/stat.h>		/* To get _STATBUF_ST_BLKSIZE.  */
 
 /* Define to empty if the keyword does not work.  */
@@ -28,11 +27,8 @@
 /* Define if you have the ANSI C header files.  */
 #define STDC_HEADERS 1
 
-/* Define if your processor stores words with the most significant
-   byte first (like Motorola and SPARC, unlike Intel and VAX).  */
-#if __BYTE_ORDER == BIG_ENDIAN
-# define WORDS_BIGENDIAN 1
-#endif
+/* Say we have endian.h.  */
+#define HAVE_ENDIAN_H	1
 
 /* Define to `int' if <sys/types.h> doesn't define.  */
 /* #undef ssize_t */
diff --git a/db2/db.h b/db2/db.h
index 3769579c58..c80d8e3633 100644
--- a/db2/db.h
+++ b/db2/db.h
@@ -4,7 +4,7 @@
  * Copyright (c) 1996, 1997
  *	Sleepycat Software.  All rights reserved.
  *
- *	@(#)db.h.src	10.67 (Sleepycat) 8/25/97
+ *	@(#)db.h.src	10.71 (Sleepycat) 9/4/97
  */
 
 #ifndef _DB_H_
@@ -67,8 +67,8 @@
 
 #define	DB_VERSION_MAJOR	2
 #define	DB_VERSION_MINOR	3
-#define	DB_VERSION_PATCH	4
-#define	DB_VERSION_STRING	"Sleepycat Software: DB 2.3.4: (8/20/97)"
+#define	DB_VERSION_PATCH	6
+#define	DB_VERSION_STRING	"Sleepycat Software: DB 2.3.6: (9/4/97)"
 
 typedef	u_int32_t	db_pgno_t;	/* Page number type. */
 typedef	u_int16_t	db_indx_t;	/* Page offset type. */
@@ -329,6 +329,7 @@ struct __db_info {
 #define	DB_NEEDSPLIT		( -9)	/* Page needs to be split. */
 #define	DB_REGISTERED		(-10)	/* Entry was previously registered. */
 #define	DB_SWAPBYTES		(-11)	/* Database needs byte swapping. */
+#define DB_TXN_CKP		(-12)	/* Encountered ckp record in log. */
 
 struct __db_ilock {			/* Internal DB access method lock. */
 	db_pgno_t	pgno;		/* Page being locked. */
@@ -479,7 +480,7 @@ extern "C" {
 int   db_appinit __P((const char *, char * const *, DB_ENV *, int));
 int   db_appexit __P((DB_ENV *));
 int   db_open __P((const char *, DBTYPE, int, int, DB_ENV *, DB_INFO *, DB **));
-const char *db_version __P((int *, int *, int *));
+char *db_version __P((int *, int *, int *));
 #if defined(__cplusplus)
 };
 #endif
diff --git a/db2/db/db.c b/db2/db/db.c
index df3a9d2d21..8dad5febe8 100644
--- a/db2/db/db.c
+++ b/db2/db/db.c
@@ -44,7 +44,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)db.c	10.37 (Sleepycat) 8/23/97";
+static const char sccsid[] = "@(#)db.c	10.38 (Sleepycat) 9/2/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -248,9 +248,6 @@ db_open(fname, type, flags, mode, dbenv, dbinfo, dbpp)
 		 * that fail, we simply retry without the O_CREAT flag, which
 		 * will require that the meta-data page exist.
 		 */
-#undef	OKFLAGS
-#define	OKFLAGS \
-    DB_CREATE | DB_NOMMAP | DB_RDONLY | DB_THREAD | DB_TRUNCATE
 		retry_cnt = 0;
 open_retry:	if (LF_ISSET(DB_CREATE)) {
 			if ((ret = __db_fdopen(real_name, flags | DB_EXCL,
@@ -308,13 +305,20 @@ open_retry:	if (LF_ISSET(DB_CREATE)) {
 			}
 			/*
 			 * The only way we can reach here with the DB_CREATE
-			 * flag set is if we created the file.  If we didn't
-			 * create the file, there's a chance that someone else
-			 * is busily doing so.  Sleep and give them a chance,
-			 * because we need the metadata page their going to
-			 * write.
+			 * flag set is if we created the file.  If that's not
+			 * the case, then a) someone else created the file
+			 * but has not yet written out the meta-data page, or
+			 * b) we truncated the file (DB_TRUNCATE) leaving it
+			 * zero-length.  In the case of a), we want to sleep
+			 * and give the file creator some time to write the
+			 * metadata page.  In the case of b), charge forward.
+			 * Note, there is a race in the case of two processes
+			 * opening the file with the DB_TRUNCATE flag set at
+			 * roughly the same time, and they could theoretically
+			 * hurt each other, although it's pretty unlikely.
 			 */
-			if (!LF_ISSET(DB_CREATE) && retry_cnt++ < 3) {
+			if (retry_cnt++ < 3 &&
+			    !LF_ISSET(DB_CREATE | DB_TRUNCATE)) {
 				__db_sleep(1, 0);
 				goto open_retry;
 			}
diff --git a/db2/db/db_conv.c b/db2/db/db_conv.c
index 39527c6804..6608005b66 100644
--- a/db2/db/db_conv.c
+++ b/db2/db/db_conv.c
@@ -44,7 +44,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)db_conv.c	10.4 (Sleepycat) 8/15/97";
+static const char sccsid[] = "@(#)db_conv.c	10.5 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -145,7 +145,7 @@ __db_convert(pg, pp, pgin)
 				M_16_SWAP(h->inp[i]);
 
 			bk = GET_BKEYDATA(h, i);
-			switch (bk->type) {
+			switch (B_TYPE(bk->type)) {
 			case B_KEYDATA:
 				M_16_SWAP(bk->len);
 				break;
@@ -167,7 +167,7 @@ __db_convert(pg, pp, pgin)
 				M_16_SWAP(h->inp[i]);
 
 			bi = GET_BINTERNAL(h, i);
-			switch (bi->type) {
+			switch (B_TYPE(bi->type)) {
 			case B_KEYDATA:
 				M_16_SWAP(bi->len);
 				M_32_SWAP(bi->pgno);
diff --git a/db2/db/db_dup.c b/db2/db/db_dup.c
index 8d364d518e..66c6c2616a 100644
--- a/db2/db/db_dup.c
+++ b/db2/db/db_dup.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)db_dup.c	10.8 (Sleepycat) 7/20/97";
+static const char sccsid[] = "@(#)db_dup.c	10.9 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -65,8 +65,7 @@ __db_dput(dbp, dbt, pp, indxp, newfunc)
 	if (dbt->size > 0.25 * dbp->pgsize) {
 		if ((ret = __db_poff(dbp, dbt, &pgno, newfunc)) != 0)
 			return (ret);
-		bo.deleted = 0;
-		bo.type = B_OVERFLOW;
+		B_TSET(bo.type, B_OVERFLOW, 0);
 		bo.tlen = dbt->size;
 		bo.pgno = pgno;
 		hdr_dbt.data = &bo;
@@ -125,7 +124,7 @@ __db_drem(dbp, pp, indx, freefunc)
 	pagep = *pp;
 
 	/* Check if we are freeing a big item. */
-	if (GET_BKEYDATA(pagep, indx)->type == B_OVERFLOW) {
+	if (B_TYPE(GET_BKEYDATA(pagep, indx)->type) == B_OVERFLOW) {
 		if ((ret = __db_doff(dbp,
 		    GET_BOVERFLOW(pagep, indx)->pgno, freefunc)) != 0)
 			return (ret);
@@ -255,7 +254,7 @@ __db_dsplit(dbp, hp, indxp, size, newfunc)
 			lastsum = sum;
 			did_indx = 1;
 		}
-		if (GET_BKEYDATA(h, i)->type == B_KEYDATA)
+		if (B_TYPE(GET_BKEYDATA(h, i)->type) == B_KEYDATA)
 			sum += BKEYDATA_SIZE(GET_BKEYDATA(h, i)->len);
 		else
 			sum += BOVERFLOW_SIZE;
@@ -300,7 +299,7 @@ __db_dsplit(dbp, hp, indxp, size, newfunc)
 
 	for (nindex = 0, oindex = i + 1; oindex < NUM_ENT(h); oindex++) {
 		bk = GET_BKEYDATA(h, oindex);
-		if (bk->type == B_KEYDATA)
+		if (B_TYPE(bk->type) == B_KEYDATA)
 			s = BKEYDATA_SIZE(bk->len);
 		else
 			s = BOVERFLOW_SIZE;
@@ -316,7 +315,7 @@ __db_dsplit(dbp, hp, indxp, size, newfunc)
 	 */
 	for (nindex = 0, oindex = 0; oindex <= i; oindex++) {
 		bk = GET_BKEYDATA(h, oindex);
-		if (bk->type == B_KEYDATA)
+		if (B_TYPE(bk->type) == B_KEYDATA)
 			s = BKEYDATA_SIZE(bk->len);
 		else
 			s = BOVERFLOW_SIZE;
@@ -474,8 +473,7 @@ __db_pitem(dbp, pagep, indx, nbytes, hdr, data)
 			return (ret);
 
 	if (hdr == NULL) {
-		bk.deleted = 0;
-		bk.type = B_KEYDATA;
+		B_TSET(bk.type, B_KEYDATA, 0);
 		bk.len = data == NULL ? 0 : data->size;
 
 		thdr.data = &bk;
diff --git a/db2/db/db_pr.c b/db2/db/db_pr.c
index c103b10e4f..f86fd6770a 100644
--- a/db2/db/db_pr.c
+++ b/db2/db/db_pr.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)db_pr.c	10.14 (Sleepycat) 8/17/97";
+static const char sccsid[] = "@(#)db_pr.c	10.16 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -461,12 +461,12 @@ __db_prpage(h, all)
 		case P_LBTREE:
 			bk = GET_BKEYDATA(h, i);
 			deleted = i % 2 == 0 &&
-			    GET_BKEYDATA(h, i + O_INDX)->deleted;
+			    B_DISSET(GET_BKEYDATA(h, i + O_INDX)->type);
 			break;
 		case P_LRECNO:
 		case P_DUPLICATE:
 			bk = GET_BKEYDATA(h, i);
-			deleted = GET_BKEYDATA(h, i)->deleted;
+			deleted = B_DISSET(GET_BKEYDATA(h, i)->type);
 			break;
 		default:
 			fprintf(fp,
@@ -525,7 +525,7 @@ __db_prpage(h, all)
 		case P_IBTREE:
 			fprintf(fp, "count: %4lu pgno: %4lu ",
 			    (u_long)bi->nrecs, (u_long)bi->pgno);
-			switch (bi->type) {
+			switch (B_TYPE(bi->type)) {
 			case B_KEYDATA:
 				__db_pr(bi->data, bi->len);
 				break;
@@ -535,7 +535,7 @@ __db_prpage(h, all)
 				break;
 			default:
 				fprintf(fp, "ILLEGAL BINTERNAL TYPE: %lu\n",
-				    (u_long)bi->type);
+				    (u_long)B_TYPE(bi->type));
 				ret = EINVAL;
 				break;
 			}
@@ -547,7 +547,7 @@ __db_prpage(h, all)
 		case P_LBTREE:
 		case P_LRECNO:
 		case P_DUPLICATE:
-			switch (bk->type) {
+			switch (B_TYPE(bk->type)) {
 			case B_KEYDATA:
 				__db_pr(bk->data, bk->len);
 				break;
@@ -558,7 +558,7 @@ __db_prpage(h, all)
 			default:
 				fprintf(fp,
 			    "ILLEGAL DUPLICATE/LBTREE/LRECNO TYPE: %lu\n",
-				    (u_long)bk->type);
+				    (u_long)B_TYPE(bk->type));
 				ret = EINVAL;
 				break;
 			}
@@ -630,11 +630,11 @@ __db_isbad(h, die)
 			break;
 		case P_IBTREE:
 			bi = GET_BINTERNAL(h, i);
-			if (bi->type != B_KEYDATA &&
-			    bi->type != B_DUPLICATE &&
-			    bi->type != B_OVERFLOW) {
+			if (B_TYPE(bi->type) != B_KEYDATA &&
+			    B_TYPE(bi->type) != B_DUPLICATE &&
+			    B_TYPE(bi->type) != B_OVERFLOW) {
 				fprintf(fp, "ILLEGAL BINTERNAL TYPE: %lu\n",
-				    (u_long)bi->type);
+				    (u_long)B_TYPE(bi->type));
 				goto bad;
 			}
 			break;
@@ -644,12 +644,12 @@ __db_isbad(h, die)
 			break;
 		case P_DUPLICATE:
 			bk = GET_BKEYDATA(h, i);
-			if (bk->type != B_KEYDATA &&
-			    bk->type != B_DUPLICATE &&
-			    bk->type != B_OVERFLOW) {
+			if (B_TYPE(bk->type) != B_KEYDATA &&
+			    B_TYPE(bk->type) != B_DUPLICATE &&
+			    B_TYPE(bk->type) != B_OVERFLOW) {
 				fprintf(fp,
 			    "ILLEGAL DUPLICATE/LBTREE/LRECNO TYPE: %lu\n",
-				    (u_long)bk->type);
+				    (u_long)B_TYPE(bk->type));
 				goto bad;
 			}
 			break;
@@ -713,18 +713,18 @@ __db_proff(vp)
 	void *vp;
 {
 	FILE *fp;
-	BOVERFLOW *p;
+	BOVERFLOW *bo;
 
 	fp = __db_prinit(NULL);
 
-	p = vp;
-	switch (p->type) {
+	bo = vp;
+	switch (B_TYPE(bo->type)) {
 	case B_OVERFLOW:
 		fprintf(fp, "overflow: total len: %4lu page: %4lu\n",
-		    (u_long)p->tlen, (u_long)p->pgno);
+		    (u_long)bo->tlen, (u_long)bo->pgno);
 		break;
 	case B_DUPLICATE:
-		fprintf(fp, "duplicate: page: %4lu\n", (u_long)p->pgno);
+		fprintf(fp, "duplicate: page: %4lu\n", (u_long)bo->pgno);
 		break;
 	}
 }
diff --git a/db2/db/db_ret.c b/db2/db/db_ret.c
index ddeb26eb94..baf0665446 100644
--- a/db2/db/db_ret.c
+++ b/db2/db/db_ret.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)db_ret.c	10.5 (Sleepycat) 7/12/97";
+static const char sccsid[] = "@(#)db_ret.c	10.6 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -63,7 +63,7 @@ __db_ret(dbp, h, indx, dbt, memp, memsize)
 	case P_LBTREE:
 	case P_LRECNO:
 		bk = GET_BKEYDATA(h, indx);
-		if (bk->type == B_OVERFLOW) {
+		if (B_TYPE(bk->type) == B_OVERFLOW) {
 			bo = (BOVERFLOW *)bk;
 			return (__db_goff(dbp, dbt,
 			    bo->tlen, bo->pgno, memp, memsize));
diff --git a/db2/db185/db185.c b/db2/db185/db185.c
index 933f55c813..8e53a1b734 100644
--- a/db2/db185/db185.c
+++ b/db2/db185/db185.c
@@ -38,7 +38,7 @@ static int db185_seq __P((const DB185 *, DBT185 *, DBT185 *, u_int));
 static int db185_sync __P((const DB185 *, u_int));
 
 DB185 *
-__dbopen(file, oflags, mode, type, openinfo)
+dbopen(file, oflags, mode, type, openinfo)
 	const char *file;
 	int oflags, mode;
 	DBTYPE type;
@@ -203,7 +203,6 @@ einval:	free(db185p);
 	errno = EINVAL;
 	return (NULL);
 }
-weak_alias (__dbopen, dbopen)
 
 static int
 db185_close(db185p)
diff --git a/db2/dbm/dbm.c b/db2/dbm/dbm.c
index 8daa980f5a..fb21ade020 100644
--- a/db2/dbm/dbm.c
+++ b/db2/dbm/dbm.c
@@ -47,7 +47,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)dbm.c	10.5 (Sleepycat) 7/19/97";
+static const char sccsid[] = "@(#)dbm.c	10.6 (Sleepycat) 8/27/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -65,6 +65,12 @@ static const char sccsid[] = "@(#)dbm.c	10.5 (Sleepycat) 7/19/97";
 #include "db_page.h"
 #include "hash.h"
 
+/* Provide prototypes here since there are none in db.h. */
+int dbm_clearerr __P((DBM *));
+int dbm_dirfno __P((DBM *));
+int dbm_error __P((DBM *));
+int dbm_pagfno __P((DBM *));
+
 /*
  *
  * This package provides dbm and ndbm compatible interfaces to DB.
@@ -75,12 +81,6 @@ static DBM *__cur_db;
 
 static void __db_no_open __P((void));
 
-/* Provide prototypes here since there are none in db.h.  */
-int	 dbm_error __P((DBM *));
-int	 dbm_clearerr __P((DBM *));
-int	 dbm_dirfno __P((DBM *));
-int	 dbm_pagfno __P((DBM *));
-
 int
 dbminit(file)
 	char *file;
diff --git a/db2/hash/hash_dup.c b/db2/hash/hash_dup.c
index 059eec6f92..c9590fa49d 100644
--- a/db2/hash/hash_dup.c
+++ b/db2/hash/hash_dup.c
@@ -42,7 +42,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)hash_dup.c	10.5 (Sleepycat) 7/27/97";
+static const char sccsid[] = "@(#)hash_dup.c	10.6 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 /*
@@ -277,8 +277,7 @@ __ham_dup_convert(hashp, hcp)
 		dndx = 0;
 		memcpy(&ho,
 		    P_ENTRY(hcp->pagep, H_DATAINDEX(hcp->bndx)), HOFFPAGE_SIZE);
-		bo.deleted = 0;
-		bo.type = ho.type;
+		B_TSET(bo.type, ho.type, 0);
 		bo.pgno = ho.pgno;
 		bo.tlen = ho.tlen;
 		dbt.size = BOVERFLOW_SIZE;
diff --git a/db2/include/db_am.h b/db2/include/db_am.h
index 3289eececa..5814ff88c3 100644
--- a/db2/include/db_am.h
+++ b/db2/include/db_am.h
@@ -4,7 +4,7 @@
  * Copyright (c) 1996, 1997
  *	Sleepycat Software.  All rights reserved.
  *
- *	@(#)db_am.h	10.5 (Sleepycat) 8/22/97
+ *	@(#)db_am.h	10.6 (Sleepycat) 8/27/97
  */
 #ifndef _DB_AM_H
 #define _DB_AM_H
@@ -30,7 +30,7 @@
 	file_dbp = mdbp = NULL;						\
 	if ((ret = func(dbtp->data, &argp)) != 0)			\
 		goto out;						\
-	if (__db_fileid_to_db(logp, &mdbp, argp->fileid)) {		\
+	if ((ret = __db_fileid_to_db(logp, &mdbp, argp->fileid)) != 0) {\
 		if (ret	== DB_DELETED)					\
 			ret = 0;					\
 		goto out;						\
diff --git a/db2/include/db_page.h b/db2/include/db_page.h
index 9e78682c57..cde7ff9f2e 100644
--- a/db2/include/db_page.h
+++ b/db2/include/db_page.h
@@ -4,7 +4,7 @@
  * Copyright (c) 1996, 1997
  *	Sleepycat Software.  All rights reserved.
  *
- *	@(#)db_page.h	10.10 (Sleepycat) 8/18/97
+ *	@(#)db_page.h	10.11 (Sleepycat) 9/3/97
  */
 
 #ifndef _DB_PAGE_H_
@@ -400,6 +400,24 @@ typedef struct _hoffdup {
 #define	B_OVERFLOW	3	/* Overflow key/data item. */
 
 /*
+ * We have to store a deleted entry flag in the page.   The reason is complex,
+ * but the simple version is that we can't delete on-page items referenced by
+ * a cursor -- the return order of subsequent insertions might be wrong.  The
+ * delete flag is an overload of the top bit of the type byte.
+ */
+#define	B_DELETE	(0x80)
+#define	B_DCLR(t)	(t) &= ~B_DELETE
+#define	B_DSET(t)	(t) |= B_DELETE
+#define	B_DISSET(t)	((t) & B_DELETE)
+
+#define	B_TYPE(t)	((t) & ~B_DELETE)
+#define	B_TSET(t, type, deleted) {					\
+	(t) = (type);							\
+	if (deleted)							\
+		B_DSET(t);						\
+}
+
+/*
  * The first type is B_KEYDATA, represented by the BKEYDATA structure:
  *
  *	+-----------------------------------+
@@ -408,8 +426,7 @@ typedef struct _hoffdup {
  */
 typedef struct _bkeydata {
 	db_indx_t len;		/* 00-01: Key/data item length. */
-	u_int	  deleted :1;	/*    02: Page type and delete flag. */
-	u_int	  type	  :7;
+	u_int8_t  type;		/*    02: Page type AND DELETE FLAG. */
 	u_int8_t  data[1];	/* Variable length key/data item. */
 } BKEYDATA;
 
@@ -438,8 +455,7 @@ typedef struct _bkeydata {
  */
 typedef struct _boverflow {
 	db_indx_t unused1;	/* 00-01: Padding, unused. */
-	u_int     deleted :1;	/*    02: Page type and delete flag. */
-	u_int     type	  :7;
+	u_int8_t  type;		/*    02: Page type AND DELETE FLAG. */
 	u_int8_t  unused2;	/*    03: Padding, unused. */
 	db_pgno_t pgno;		/* 04-07: Next page number. */
 	u_int32_t tlen;		/* 08-11: Total length of item. */
@@ -479,9 +495,8 @@ typedef struct _boverflow {
  *	+-----------------------------------+
  */
 typedef struct _binternal {
-	db_indx_t len;		/* 00-01: Key/data item length. */
-	u_int      deleted :1;	/*    02: Page type and delete flag. */
-	u_int      type	  :7;
+	db_indx_t  len;		/* 00-01: Key/data item length. */
+	u_int8_t   type;	/*    02: Page type AND DELETE FLAG. */
 	u_int8_t   unused;	/*    03: Padding, unused. */
 	db_pgno_t  pgno;	/* 04-07: Page number of referenced page. */
 	db_recno_t nrecs;	/* 08-11: Subtree record count. */
diff --git a/db2/include/mp.h b/db2/include/mp.h
index 4872596f83..1fe0c752a9 100644
--- a/db2/include/mp.h
+++ b/db2/include/mp.h
@@ -4,7 +4,7 @@
  * Copyright (c) 1996, 1997
  *	Sleepycat Software.  All rights reserved.
  *
- *	@(#)mp.h	10.14 (Sleepycat) 8/18/97
+ *	@(#)mp.h	10.15 (Sleepycat) 8/29/97
  */
 
 struct __bh;		typedef struct __bh BH;
@@ -161,9 +161,12 @@ struct __db_mpoolfile {
 	void	  *addr;		/* Address of mmap'd region. */
 	size_t	   len;			/* Length of mmap'd region. */
 
-#define	MP_PATH_ALLOC	0x01		/* Path is allocated memory. */
-#define	MP_PATH_TEMP	0x02		/* Backing file is a temporary. */
-#define	MP_READONLY	0x04		/* File is readonly. */
+/* These fields need to be protected for multi-threaded support. */
+#define	MP_PATH_ALLOC	0x001		/* Path is allocated memory. */
+#define	MP_PATH_TEMP	0x002		/* Backing file is a temporary. */
+#define	MP_READONLY	0x004		/* File is readonly. */
+#define	MP_UPGRADE	0x008		/* File descriptor is readwrite. */
+#define	MP_UPGRADE_FAIL	0x010		/* Upgrade wasn't possible. */
 	u_int32_t  flags;
 };
 
diff --git a/db2/log/log.c b/db2/log/log.c
index 1684ce8cc8..d3e5183588 100644
--- a/db2/log/log.c
+++ b/db2/log/log.c
@@ -7,7 +7,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)log.c	10.24 (Sleepycat) 8/16/97";
+static const char sccsid[] = "@(#)log.c	10.25 (Sleepycat) 8/27/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
diff --git a/db2/log/log_findckp.c b/db2/log/log_findckp.c
index 67fe9c9f50..df75e20e03 100644
--- a/db2/log/log_findckp.c
+++ b/db2/log/log_findckp.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)log_findckp.c	10.10 (Sleepycat) 7/30/97";
+static const char sccsid[] = "@(#)log_findckp.c	10.11 (Sleepycat) 8/27/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -119,7 +119,7 @@ __log_findckp(lp, lsnp)
 			return (ret);
 		if (F_ISSET(lp, DB_AM_THREAD))
 			free(data.data);
-	} 
+	}
 	*lsnp = last_ckp;
 
 	if (verbose)
diff --git a/db2/log/log_get.c b/db2/log/log_get.c
index 37eb5cb249..54a58c75fc 100644
--- a/db2/log/log_get.c
+++ b/db2/log/log_get.c
@@ -7,7 +7,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)log_get.c	10.16 (Sleepycat) 8/19/97";
+static const char sccsid[] = "@(#)log_get.c	10.17 (Sleepycat) 8/27/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -115,8 +115,8 @@ __log_get(dblp, alsn, dbt, flags, silent)
 	size_t len;
 	ssize_t nr;
 	int cnt, ret;
-	const char *fail;
 	char *np, *tbuf;
+	const char *fail;
 	void *p, *shortp;
 
 	lp = dblp->lp;
diff --git a/db2/log/log_rec.c b/db2/log/log_rec.c
index dbc5960731..f49a7f16ea 100644
--- a/db2/log/log_rec.c
+++ b/db2/log/log_rec.c
@@ -40,7 +40,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)log_rec.c	10.11 (Sleepycat) 8/20/97";
+static const char sccsid[] = "@(#)log_rec.c	10.13 (Sleepycat) 8/27/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -59,7 +59,7 @@ static const char sccsid[] = "@(#)log_rec.c	10.11 (Sleepycat) 8/20/97";
 #include "db_dispatch.h"
 #include "common_ext.h"
 
-static int __log_open_file __P((DB_LOG *, 
+static int __log_open_file __P((DB_LOG *,
     u_int8_t *, char *, DBTYPE, u_int32_t));
 
 /*
@@ -132,10 +132,16 @@ __log_unregister_recover(logp, dbtp, lsnp, redo, info)
 	if ((ret = __log_unregister_read(dbtp->data, &argp)) != 0)
 		goto out;
 
+	/*
+	 * If the file is deleted, then we can just ignore this close.
+	 * Otherwise, we'd better have a valid dbp that we should either
+	 * close or whose reference count should be decremented.
+	 */
 	LOCK_LOGTHREAD(logp);
-	if (logp->dbentry[argp->id].dbp == NULL)
-		ret = EINVAL;
-	else if (--logp->dbentry[argp->id].refcount == 0) {
+	if (logp->dbentry[argp->id].dbp == NULL) {
+		if (!logp->dbentry[argp->id].deleted)
+			ret = EINVAL;
+	} else if (--logp->dbentry[argp->id].refcount == 0) {
 		ret = logp->dbentry[argp->id].dbp->close(
 		    logp->dbentry[argp->id].dbp, 0);
 		logp->dbentry[argp->id].dbp = NULL;
diff --git a/db2/mp/mp_bh.c b/db2/mp/mp_bh.c
index e1b68ce450..3d0d053b5f 100644
--- a/db2/mp/mp_bh.c
+++ b/db2/mp/mp_bh.c
@@ -7,7 +7,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)mp_bh.c	10.12 (Sleepycat) 8/20/97";
+static const char sccsid[] = "@(#)mp_bh.c	10.15 (Sleepycat) 8/29/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -24,6 +24,8 @@ static const char sccsid[] = "@(#)mp_bh.c	10.12 (Sleepycat) 8/20/97";
 #include "mp.h"
 #include "common_ext.h"
 
+static int __memp_upgrade __P((DB_MPOOL *, DB_MPOOLFILE *, MPOOLFILE *));
+
 /*
  * __memp_bhwrite --
  *	Write the page associated with a given bucket header.
@@ -48,14 +50,20 @@ __memp_bhwrite(dbmp, mfp, bhp, restartp, wrotep)
 		*wrotep = 0;
 
 	/*
-	 * Walk the process' DB_MPOOLFILE list and try and find a file
-	 * descriptor for this file.
+	 * Walk the process' DB_MPOOLFILE list and find a file descriptor for
+	 * the file.  We also check that the descriptor is open for writing.
+	 * If we find a descriptor on the file that's not open for writing, we
+	 * try and upgrade it to make it writeable.
 	 */
 	LOCKHANDLE(dbmp, &dbmp->mutex);
 	for (dbmfp = TAILQ_FIRST(&dbmp->dbmfq);
 	    dbmfp != NULL; dbmfp = TAILQ_NEXT(dbmfp, q))
-		if (dbmfp->mfp == mfp)
+		if (dbmfp->mfp == mfp) {
+			if (F_ISSET(dbmfp, MP_READONLY) &&
+			    __memp_upgrade(dbmp, dbmfp, mfp))
+				return (0);
 			break;
+		}
 	UNLOCKHANDLE(dbmp, &dbmp->mutex);
 	if (dbmfp != NULL)
 		goto found;
@@ -80,6 +88,10 @@ __memp_bhwrite(dbmp, mfp, bhp, restartp, wrotep)
 	/*
 	 * Try and open the file; ignore any error, assume it's a permissions
 	 * problem.
+	 *
+	 * XXX
+	 * There's no negative cache here, so we may repeatedly try and open
+	 * files that we have previously tried (and failed) to open.
 	 */
 	dbt.size = mfp->pgcookie_len;
 	dbt.data = ADDR(dbmp, mfp->pgcookie_off);
@@ -435,3 +447,42 @@ __memp_bhfree(dbmp, mfp, bhp, free_mem)
 	if (free_mem)
 		__db_shalloc_free(dbmp->addr, bhp);
 }
+
+/*
+ * __memp_upgrade --
+ *	Upgrade a file descriptor from readonly to readwrite.
+ */
+static int
+__memp_upgrade(dbmp, dbmfp, mfp)
+	DB_MPOOL *dbmp;
+	DB_MPOOLFILE *dbmfp;
+	MPOOLFILE *mfp;
+{
+	int fd;
+
+	/*
+	 * !!!
+	 * We expect the handle to already be locked.
+	 */
+
+	/* Check to see if we've already upgraded. */
+	if (F_ISSET(dbmfp, MP_UPGRADE))
+		return (0);
+
+	/* Check to see if we've already failed. */
+	if (F_ISSET(dbmfp, MP_UPGRADE_FAIL))
+		return (1);
+
+	/* Try the open. */
+	if (__db_fdopen(ADDR(dbmp, mfp->path_off), 0, 0, 0, &fd) != 0) {
+		F_SET(dbmfp, MP_UPGRADE_FAIL);
+		return (1);
+	}
+
+	/* Swap the descriptors and set the upgrade flag. */
+	(void)close(dbmfp->fd);
+	dbmfp->fd = fd;
+	F_SET(dbmfp, MP_UPGRADE);
+
+	return (0);
+}
diff --git a/db2/mp/mp_fopen.c b/db2/mp/mp_fopen.c
index 7703847b73..1a770bfdf0 100644
--- a/db2/mp/mp_fopen.c
+++ b/db2/mp/mp_fopen.c
@@ -7,7 +7,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)mp_fopen.c	10.24 (Sleepycat) 8/20/97";
+static const char sccsid[] = "@(#)mp_fopen.c	10.25 (Sleepycat) 8/27/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -110,7 +110,7 @@ __memp_fopen(dbmp, path,
 			ret = EINVAL;
 			goto err;
 		}
-		dbmfp->path = (char *) TEMPORARY;
+		dbmfp->path = (char *)TEMPORARY;
 		F_SET(dbmfp, MP_PATH_TEMP);
 	} else {
 		/* Calculate the real name for this file. */
diff --git a/db2/mp/mp_pr.c b/db2/mp/mp_pr.c
index 94eabf5947..7794cfa7f3 100644
--- a/db2/mp/mp_pr.c
+++ b/db2/mp/mp_pr.c
@@ -7,7 +7,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)mp_pr.c	10.12 (Sleepycat) 7/29/97";
+static const char sccsid[] = "@(#)mp_pr.c	10.13 (Sleepycat) 8/27/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
diff --git a/db2/mp/mp_sync.c b/db2/mp/mp_sync.c
index 4f1205661a..65b2a18267 100644
--- a/db2/mp/mp_sync.c
+++ b/db2/mp/mp_sync.c
@@ -7,7 +7,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)mp_sync.c	10.8 (Sleepycat) 7/2/97";
+static const char sccsid[] = "@(#)mp_sync.c	10.9 (Sleepycat) 8/29/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -167,8 +167,12 @@ memp_fsync(dbmfp)
 	size_t mf_offset;
 	int pincnt, restart, ret, wrote;
 
-	/* We don't sync temporary files -- what's the use? */
-	if (F_ISSET(dbmfp, MP_PATH_TEMP))
+	/*
+	 * If this handle doesn't have a file descriptor that's open for
+	 * writing, or if the file is a temporary, there's no reason to
+	 * proceed further.
+	 */
+	if (F_ISSET(dbmfp, MP_READONLY | MP_PATH_TEMP))
 		return (0);
 
 	dbmp = dbmfp->dbmp;
@@ -199,7 +203,7 @@ retry:	pincnt = 0;
 				goto retry;
 		}
 
-	UNLOCKREGION(dbmp);
+err:	UNLOCKREGION(dbmp);
 
-err:	return (ret == 0 ? (pincnt ? DB_INCOMPLETE : 0) : ret);
+	return (ret == 0 ? (pincnt ? DB_INCOMPLETE : 0) : ret);
 }
diff --git a/db2/mutex/x86.gcc b/db2/mutex/x86.gcc
index 886a6811a2..566b9c4433 100644
--- a/db2/mutex/x86.gcc
+++ b/db2/mutex/x86.gcc
@@ -1,12 +1,12 @@
 /*
- * @(#)x86.gcc	10.2 (Sleepycat) 6/21/97
+ * @(#)x86.gcc	10.3 (Sleepycat) 8/27/97
  *
  * For gcc/x86, 0 is clear, 1 is set.
  */
 #define	TSL_SET(tsl) ({							\
 	register tsl_t *__l = (tsl);					\
 	int __r;							\
-	asm volatile("movl $1,%%eax; xchgb %1,%%al; xorl $1,%%eax"	\
+	asm volatile("movl $1,%%eax; lock; xchgb %1,%%al; xorl $1,%%eax"\
 	    : "=&a" (__r), "=m" (*__l)					\
 	    : "1" (*__l)						\
 	    );								\
diff --git a/db2/os/db_os_dir.c b/db2/os/db_os_dir.c
index 23a6a45919..6dabd62049 100644
--- a/db2/os/db_os_dir.c
+++ b/db2/os/db_os_dir.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)db_os_dir.c	10.7 (Sleepycat) 8/23/97";
+static const char sccsid[] = "@(#)db_os_dir.c	10.8 (Sleepycat) 8/27/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -45,7 +45,7 @@ static const char sccsid[] = "@(#)db_os_dir.c	10.7 (Sleepycat) 8/23/97";
  * __db_dir --
  *	Return a list of the files in a directory.
  *
- * PUBLIC: int __db_dir __P((DB_ENV *, char *, char ***, int *));
+ * PUBLIC: int __db_dir __P((DB_ENV *, const char *, char ***, int *));
  */
 int
 __db_dir(dbenv, dir, namesp, cntp)
@@ -61,7 +61,7 @@ __db_dir(dbenv, dir, namesp, cntp)
 	long dirhandle;
 	int finished;
 
-	if ((dirhandle = _findfirst(dir,&fdata)) == -1) {
+	if ((dirhandle = _findfirst(dir, &fdata)) == -1) {
 		__db_err(dbenv, "%s: %s", dir, strerror(errno));
 		return (errno);
 	}
diff --git a/db2/os/db_os_fid.c b/db2/os/db_os_fid.c
index 8fa55fa56c..960d580bad 100644
--- a/db2/os/db_os_fid.c
+++ b/db2/os/db_os_fid.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)db_os_fid.c	10.7 (Sleepycat) 8/21/97";
+static const char sccsid[] = "@(#)db_os_fid.c	10.8 (Sleepycat) 8/27/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -39,9 +39,9 @@ __db_fileid(dbenv, fname, timestamp, fidp)
 	int timestamp;
 	u_int8_t *fidp;
 {
+	size_t i;
 	time_t now;
 	u_int8_t *p;
-	unsigned int i;
 
 #ifdef _WIN32
 	/*
diff --git a/db2/progs/db_archive/db_archive.c b/db2/progs/db_archive/db_archive.c
index 136cf2c360..a9c6c28e70 100644
--- a/db2/progs/db_archive/db_archive.c
+++ b/db2/progs/db_archive/db_archive.c
@@ -11,7 +11,7 @@
 static const char copyright[] =
 "@(#) Copyright (c) 1997\n\
 	Sleepycat Software Inc.  All rights reserved.\n";
-static const char sccsid[] = "@(#)db_archive.c	10.12 (Sleepycat) 7/25/97";
+static const char sccsid[] = "@(#)db_archive.c	10.15 (Sleepycat) 8/27/97";
 #endif
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -34,12 +34,13 @@ static const char sccsid[] = "@(#)db_archive.c	10.12 (Sleepycat) 7/25/97";
 
 DB_ENV	*db_init __P((char *, int));
 void	 onint __P((int));
+int	 main __P((int, char *[]));
 void	 siginit __P((void));
 void	 usage __P((void));
-int	 main __P((int, char *[]));
 
 int	 interrupted;
-const char *progname = "db_archive";			/* Program name. */
+const char
+	*progname = "db_archive";			/* Program name. */
 
 int
 main(argc, argv)
diff --git a/db2/progs/db_checkpoint/db_checkpoint.c b/db2/progs/db_checkpoint/db_checkpoint.c
index 586b4b9686..4f9b79a7ba 100644
--- a/db2/progs/db_checkpoint/db_checkpoint.c
+++ b/db2/progs/db_checkpoint/db_checkpoint.c
@@ -11,7 +11,7 @@
 static const char copyright[] =
 "@(#) Copyright (c) 1997\n\
 	Sleepycat Software Inc.  All rights reserved.\n";
-static const char sccsid[] = "@(#)db_checkpoint.c	10.9 (Sleepycat) 7/4/97";
+static const char sccsid[] = "@(#)db_checkpoint.c	10.11 (Sleepycat) 8/27/97";
 #endif
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -39,14 +39,15 @@ char	*check __P((DB_ENV *, long, long));
 int	 checkpoint __P((DB_ENV *, char *, int));
 DB_ENV	*db_init __P((char *));
 int	 logpid __P((char *, int));
+int	 main __P((int, char *[]));
 void	 onint __P((int));
 void	 siginit __P((void));
 void	 usage __P((void));
-int	 main __P((int, char *[]));
 
 int	 interrupted;
 time_t	 now;					/* Checkpoint time. */
-const char *progname = "db_checkpoint";		/* Program name. */
+const char
+	*progname = "db_checkpoint";		/* Program name. */
 
 int
 main(argc, argv)
diff --git a/db2/progs/db_deadlock/db_deadlock.c b/db2/progs/db_deadlock/db_deadlock.c
index 9437e3552d..09004f58b3 100644
--- a/db2/progs/db_deadlock/db_deadlock.c
+++ b/db2/progs/db_deadlock/db_deadlock.c
@@ -11,7 +11,7 @@
 static const char copyright[] =
 "@(#) Copyright (c) 1997\n\
 	Sleepycat Software Inc.  All rights reserved.\n";
-static const char sccsid[] = "@(#)db_deadlock.c	10.13 (Sleepycat) 7/20/97";
+static const char sccsid[] = "@(#)db_deadlock.c	10.14 (Sleepycat) 8/27/97";
 #endif
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -33,14 +33,15 @@ static const char sccsid[] = "@(#)db_deadlock.c	10.13 (Sleepycat) 7/20/97";
 #define	BAD_KILLID	0xffffffff
 
 DB_ENV	*db_init __P((char *, int));
+int	 logpid __P((char *, int));
+int	 main __P((int, char *[]));
 void	 onint __P((int));
 void	 siginit __P((void));
 void	 usage __P((void));
-int	 logpid __P((char *, int));
-int	 main __P((int, char *[]));
 
 int	 interrupted;
-const char *progname = "db_deadlock";			/* Program name. */
+const char
+	*progname = "db_deadlock";			/* Program name. */
 
 int
 main(argc, argv)
diff --git a/db2/progs/db_dump/db_dump.c b/db2/progs/db_dump/db_dump.c
index d60aa9b5c9..a0f60c69a6 100644
--- a/db2/progs/db_dump/db_dump.c
+++ b/db2/progs/db_dump/db_dump.c
@@ -11,7 +11,7 @@
 static const char copyright[] =
 "@(#) Copyright (c) 1997\n\
 	Sleepycat Software Inc.  All rights reserved.\n";
-static const char sccsid[] = "@(#)db_dump.c	10.13 (Sleepycat) 8/19/97";
+static const char sccsid[] = "@(#)db_dump.c	10.16 (Sleepycat) 8/27/97";
 #endif
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -19,10 +19,10 @@ static const char sccsid[] = "@(#)db_dump.c	10.13 (Sleepycat) 8/19/97";
 
 #include <ctype.h>
 #include <errno.h>
-#include <getopt.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <unistd.h>
 #endif
 
 #include "db_int.h"
@@ -35,11 +35,12 @@ void	configure __P((char *));
 DB_ENV *db_init __P((char *));
 void	dbt_dump __P((DBT *));
 void	dbt_print __P((DBT *));
+int	main __P((int, char *[]));
 void	pheader __P((DB *, int));
 void	usage __P((void));
-int	main __P((int, char *[]));
 
-const char *progname = "db_dump";		/* Program name. */
+const char
+	*progname = "db_dump";				/* Program name. */
 
 int
 main(argc, argv)
diff --git a/db2/progs/db_dump185/db_dump185.c b/db2/progs/db_dump185/db_dump185.c
index f3c1187e45..6e2d95bee0 100644
--- a/db2/progs/db_dump185/db_dump185.c
+++ b/db2/progs/db_dump185/db_dump185.c
@@ -11,7 +11,7 @@
 static const char copyright[] =
 "@(#) Copyright (c) 1997\n\
 	Sleepycat Software Inc.  All rights reserved.\n";
-static const char sccsid[] = "@(#)db_dump185.c	10.5 (Sleepycat) 7/2/97";
+static const char sccsid[] = "@(#)db_dump185.c	10.7 (Sleepycat) 8/27/97";
 #endif
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -20,10 +20,10 @@ static const char sccsid[] = "@(#)db_dump185.c	10.5 (Sleepycat) 7/2/97";
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
-#include <getopt.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <unistd.h>
 #endif
 
 #include "db_185.h"
@@ -149,14 +149,15 @@ typedef struct _btree {
 	u_int32_t flags;
 } BTREE;
 
-void db_185_btree __P((DB *, int));
-void db_185_hash __P((DB *, int));
-void dbt_dump __P((DBT *));
-void dbt_print __P((DBT *));
-void usage __P((void));
-int main __P((int, char *[]));
+void	db_185_btree __P((DB *, int));
+void	db_185_hash __P((DB *, int));
+void	dbt_dump __P((DBT *));
+void	dbt_print __P((DBT *));
+int	main __P((int, char *[]));
+void	usage __P((void));
 
-const char *progname = "db_dump185";		/* Program name. */
+const char
+	*progname = "db_dump185";			/* Program name. */
 
 int
 main(argc, argv)
diff --git a/db2/progs/db_load/db_load.c b/db2/progs/db_load/db_load.c
index cc90e7bd27..6f69216777 100644
--- a/db2/progs/db_load/db_load.c
+++ b/db2/progs/db_load/db_load.c
@@ -11,7 +11,7 @@
 static const char copyright[] =
 "@(#) Copyright (c) 1997\n\
 	Sleepycat Software Inc.  All rights reserved.\n";
-static const char sccsid[] = "@(#)db_load.c	10.9 (Sleepycat) 8/19/97";
+static const char sccsid[] = "@(#)db_load.c	10.12 (Sleepycat) 8/28/97";
 #endif
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -19,11 +19,11 @@ static const char sccsid[] = "@(#)db_load.c	10.9 (Sleepycat) 8/19/97";
 #include <sys/stat.h>
 
 #include <errno.h>
-#include <getopt.h>
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 #endif
 
 #include "db_int.h"
@@ -35,11 +35,12 @@ DB_ENV *db_init __P((char *));
 int	dbt_rdump __P((DBT *));
 int	dbt_rprint __P((DBT *));
 int	digitize __P((int));
+int	main __P((int, char *[]));
 void	rheader __P((DBTYPE *, int *, DB_INFO *));
 void	usage __P((void));
-int	main __P((int, char *[]));
 
-const char *progname = "db_load";		/* Program name. */
+const char
+	*progname = "db_load";				/* Program name. */
 
 int
 main(argc, argv)
@@ -273,7 +274,7 @@ rheader(dbtypep, pflagp, dbinfop)
 
 	for (lineno = 1;; ++lineno) {
 		if (fscanf(stdin, "%[^=]=%s\n", name, value) != 2)
-			errx(1, "line %lu: unexpected line", lineno);
+			errx(1, "line %lu: unexpected format", lineno);
 		if (strcmp(name, "HEADER") == 0)
 			break;
 
diff --git a/db2/progs/db_printlog/db_printlog.c b/db2/progs/db_printlog/db_printlog.c
index 12c365524f..6bbd118b1b 100644
--- a/db2/progs/db_printlog/db_printlog.c
+++ b/db2/progs/db_printlog/db_printlog.c
@@ -11,7 +11,7 @@
 static const char copyright[] =
 "@(#) Copyright (c) 1997\n\
 	Sleepycat Software Inc.  All rights reserved.\n";
-static const char sccsid[] = "@(#)db_printlog.c	10.8 (Sleepycat) 7/15/97";
+static const char sccsid[] = "@(#)db_printlog.c	10.10 (Sleepycat) 8/27/97";
 #endif
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -35,11 +35,13 @@ static const char sccsid[] = "@(#)db_printlog.c	10.8 (Sleepycat) 7/15/97";
 #include "clib_ext.h"
 
 DB_ENV *db_init __P((char *));
+int	main __P((int, char *[]));
 void	onint __P((int));
 void	usage __P((void));
 
 int	 interrupted;
-char	*progname = "db_printlog";			/* Program name. */
+const char
+	*progname = "db_printlog";			/* Program name. */
 
 int
 main(argc, argv)
@@ -114,7 +116,7 @@ main(argc, argv)
 		(void)raise(SIGINT);
 		/* NOTREACHED */
 	}
-	exit (eval);
+	return (eval);
 }
 
 /*
diff --git a/db2/progs/db_recover/db_recover.c b/db2/progs/db_recover/db_recover.c
index 4ac5925f79..d17c4b0c76 100644
--- a/db2/progs/db_recover/db_recover.c
+++ b/db2/progs/db_recover/db_recover.c
@@ -11,16 +11,16 @@
 static const char copyright[] =
 "@(#) Copyright (c) 1997\n\
 	Sleepycat Software Inc.  All rights reserved.\n";
-static const char sccsid[] = "@(#)db_recover.c	10.12 (Sleepycat) 7/27/97";
+static const char sccsid[] = "@(#)db_recover.c	10.14 (Sleepycat) 8/27/97";
 #endif
 
 #ifndef NO_SYSTEM_INCLUDES
 #include <sys/types.h>
 
 #include <errno.h>
-#include <getopt.h>
 #include <stdlib.h>
 #include <time.h>
+#include <unistd.h>
 #endif
 
 #include "db_int.h"
@@ -29,10 +29,11 @@ static const char sccsid[] = "@(#)db_recover.c	10.12 (Sleepycat) 7/27/97";
 #include "clib_ext.h"
 
 DB_ENV	*db_init __P((char *, int, int));
-void	 usage __P((void));
 int	 main __P((int, char *[]));
+void	 usage __P((void));
 
-const char *progname = "db_recover";			/* Program name. */
+const char
+	*progname = "db_recover";			/* Program name. */
 
 int
 main(argc, argv)
diff --git a/db2/progs/db_stat/db_stat.c b/db2/progs/db_stat/db_stat.c
index 5c7044dbce..1a989f4df3 100644
--- a/db2/progs/db_stat/db_stat.c
+++ b/db2/progs/db_stat/db_stat.c
@@ -11,7 +11,7 @@
 static const char copyright[] =
 "@(#) Copyright (c) 1997\n\
 	Sleepycat Software Inc.  All rights reserved.\n";
-static const char sccsid[] = "@(#)db_stat.c	8.17 (Sleepycat) 8/24/97";
+static const char sccsid[] = "@(#)db_stat.c	8.20 (Sleepycat) 8/27/97";
 #endif
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -36,16 +36,17 @@ typedef enum { T_NOTSET, T_DB, T_MPOOL, T_TXN } test_t;
 void	bstat __P((DB *));
 DB_ENV *db_init __P((char *, test_t));
 void	hstat __P((DB *));
+int	main __P((int, char *[]));
 void	mstat __P((DB_ENV *));
-void	prflags __P((u_int32_t, const FN *));
 void	onint __P((int));
+void	prflags __P((u_int32_t, const FN *));
 void	tstat __P((DB_ENV *));
 int	txn_compare __P((const void *, const void *));
 void	usage __P((void));
-int	main __P((int, char *[]));
 
 int	 interrupted;
-const char *progname = "db_stat";			/* Program name. */
+const char
+	*progname = "db_stat";				/* Program name. */
 
 int
 main(argc, argv)
@@ -297,7 +298,7 @@ tstat(dbenv)
 	DB_ENV *dbenv;
 {
 	DB_TXN_STAT *tstat;
-	unsigned int i;
+	u_int32_t i;
 	const char *p;
 
 	if (txn_stat(dbenv->tx_info, &tstat, NULL))
diff --git a/db2/txn/txn.c b/db2/txn/txn.c
index b20697be3b..cb700dc037 100644
--- a/db2/txn/txn.c
+++ b/db2/txn/txn.c
@@ -43,7 +43,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)txn.c	10.20 (Sleepycat) 8/24/97";
+static const char sccsid[] = "@(#)txn.c	10.24 (Sleepycat) 9/3/97";
 #endif /* not lint */
 
 
@@ -80,12 +80,11 @@ static const char sccsid[] = "@(#)txn.c	10.20 (Sleepycat) 8/24/97";
 #include "common_ext.h"
 
 static int __txn_check_running __P((const DB_TXN *));
-
-static int	__txn_create __P((DB_ENV *, const char *, u_int));
-static int	__txn_grow_region __P((DB_TXNMGR *));
-static int	__txn_validate_region __P((DB_TXNMGR *));
-static int      __txn_end __P((DB_TXN *, int));
-static int      __txn_undo __P((DB_TXN *));
+static int __txn_create __P((DB_ENV *, const char *, u_int));
+static int __txn_end __P((DB_TXN *, int));
+static int __txn_grow_region __P((DB_TXNMGR *));
+static int __txn_undo __P((DB_TXN *));
+static int __txn_validate_region __P((DB_TXNMGR *));
 
 /*
  * Create and initialize a transaction region in shared memory.
@@ -622,6 +621,7 @@ txn_checkpoint(mgr, kbytes, minutes)
 	if (minutes != 0 || kbytes != 0)
 		return (0);
 
+do_ckp:
 	if (IS_ZERO_LSN(ckp_lsn)) {
 		dblp = mgr->dbenv->lg_info;
 		LOCK_LOGREGION(dblp);
@@ -633,7 +633,6 @@ txn_checkpoint(mgr, kbytes, minutes)
 	 * We have to find an LSN such that all transactions begun
 	 * before that LSN are complete.
 	 */
-do_ckp:
 	LOCK_TXNREGION(mgr);
 
 	if (!IS_ZERO_LSN(mgr->region->pending_ckp))
@@ -755,8 +754,7 @@ txn_stat(mgr, statp, db_malloc)
 {
 	DB_TXN_STAT *stats;
 	size_t nbytes;
-	u_int32_t nactive;
-	unsigned int i, ndx;
+	u_int32_t i, nactive, ndx;
 
 	LOCK_TXNREGION(mgr);
 	nactive = mgr->region->nbegins -
diff --git a/db2/txn/txn_rec.c b/db2/txn/txn_rec.c
index 1fe720a1cf..c172d874d9 100644
--- a/db2/txn/txn_rec.c
+++ b/db2/txn/txn_rec.c
@@ -40,7 +40,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)txn_rec.c	10.4 (Sleepycat) 7/2/97";
+static const char sccsid[] = "@(#)txn_rec.c	10.5 (Sleepycat) 8/27/97";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -127,5 +127,5 @@ __txn_ckp_recover(logp, dbtp, lsnp, redo, info)
 
 	*lsnp = argp->last_ckp;
 	free(argp);
-	return (1);
+	return (DB_TXN_CKP);
 }