--- /dev/null
+Index: db/hash/hash_dup.c
+===================================================================
+RCS file: /cvs/devel/rpm/db/hash/hash_dup.c,v
+retrieving revision 1.1.1.2.2.3
+retrieving revision 1.1.1.2.2.4
+diff -u -1 -0 -r1.1.1.2.2.3 -r1.1.1.2.2.4
+--- db/hash/hash_dup.c 2002/01/08 04:07:30 1.1.1.2.2.3
++++ db/hash/hash_dup.c 2002/02/13 23:22:52 1.1.1.2.2.4
+@@ -606,20 +606,25 @@
+ PGNO(next_pagep), NUM_ENT(next_pagep) - 2)) != 0)
+ goto out;
+
+ /* Now delete the pair from the current page. */
+ ret = __ham_del_pair(dbc, 0);
+
+ /*
+ * __ham_del_pair decremented nelem. This is incorrect; we
+ * manually copied the element elsewhere, so the total number
+ * of elements hasn't changed. Increment it again.
++ *
++ * !!!
++ * Note that we still have the metadata page pinned, and
++ * __ham_del_pair dirtied it, so we don't need to set the dirty
++ * flag again.
+ */
+ if (!STD_LOCKING(dbc))
+ hcp->hdr->nelem++;
+
+ out:
+ (void)mpf->put(mpf, hcp->page, DB_MPOOL_DIRTY);
+ hcp->page = next_pagep;
+ hcp->pgno = PGNO(hcp->page);
+ hcp->indx = NUM_ENT(hcp->page) - 2;
+ F_SET(hcp, H_EXPAND);
+Index: db/hash/hash_page.c
+===================================================================
+RCS file: /cvs/devel/rpm/db/hash/hash_page.c,v
+retrieving revision 1.1.1.2.2.3
+retrieving revision 1.1.1.2.2.4
+diff -u -1 -0 -r1.1.1.2.2.3 -r1.1.1.2.2.4
+--- db/hash/hash_page.c 2002/01/08 04:07:30 1.1.1.2.2.3
++++ db/hash/hash_page.c 2002/02/13 23:22:52 1.1.1.2.2.4
+@@ -636,22 +636,25 @@
+ if ((ret = __ham_c_update(dbc, 0, 0, 0)) != 0)
+ return (ret);
+
+ /*
+ * If we are locking, we will not maintain this, because it is
+ * a hot spot.
+ *
+ * XXX
+ * Perhaps we can retain incremental numbers and apply them later.
+ */
+- if (!STD_LOCKING(dbc))
++ if (!STD_LOCKING(dbc)) {
+ --hcp->hdr->nelem;
++ if ((ret = __ham_dirty_meta(dbc)) != 0)
++ return (ret);
++ }
+
+ /*
+ * If we need to reclaim the page, then check if the page is empty.
+ * There are two cases. If it's empty and it's not the first page
+ * in the bucket (i.e., the bucket page) then we can simply remove
+ * it. If it is the first chain in the bucket, then we need to copy
+ * the second page into it and remove the second page.
+ * If its the only page in the bucket we leave it alone.
+ */
+ if (!reclaim_page ||
+@@ -1407,22 +1410,25 @@
+ * next time we come in here. For other operations, this shouldn't
+ * matter, since odds are this is the last thing that happens before
+ * we return to the user program.
+ */
+ hcp->pgno = PGNO(hcp->page);
+
+ /*
+ * XXX
+ * Maybe keep incremental numbers here.
+ */
+- if (!STD_LOCKING(dbc))
++ if (!STD_LOCKING(dbc)) {
+ hcp->hdr->nelem++;
++ if ((ret = __ham_dirty_meta(dbc)) != 0)
++ return (ret);
++ }
+
+ if (do_expand || (hcp->hdr->ffactor != 0 &&
+ (u_int32_t)H_NUMPAIRS(hcp->page) > hcp->hdr->ffactor))
+ F_SET(hcp, H_EXPAND);
+ return (0);
+ }
+
+ /*
+ * Special __putitem call used in splitting -- copies one entry to
+ * another. Works for all types of hash entries (H_OFFPAGE, H_KEYDATA,