+// write page to permanent location in Btree file
+// clear the dirty bit
+
+BTERR bt_writepage (BtDb *bt, BtPage page, uid page_no)
+{
+off64_t off = page_no << bt->page_bits;
+
+#ifdef unix
+ page->dirty = 0;
+
+ if( pwrite(bt->idx, page, bt->page_size, off) < bt->page_size )
+ return bt->err = BTERR_wrt;
+#else
+OVERLAPPED ovl[1];
+uint amt[1];
+
+ memset (ovl, 0, sizeof(OVERLAPPED));
+ ovl->Offset = off;
+ ovl->OffsetHigh = off >> 32;
+ page->dirty = 0;
+
+ if( !WriteFile(bt->idx, page, bt->page_size, amt, ovl) )
+ return bt->err = BTERR_wrt;
+
+ if( *amt < bt->page_size )
+ return bt->err = BTERR_wrt;
+#endif
+ return 0;
+}
+
+// link latch table entry into head of latch hash table
+
+BTERR bt_latchlink (BtDb *bt, uint hashidx, uint slot, uid page_no)
+{
+BtPage page = (BtPage)(slot * bt->page_size + bt->pagepool);
+BtLatchSet *latch = bt->latchsets + slot;
+
+ if( latch->next = bt->table[hashidx].slot )
+ bt->latchsets[latch->next].prev = slot;
+
+ bt->table[hashidx].slot = slot;
+ latch->page_no = page_no;
+ latch->prev = 0;
+ latch->pin = 1;
+
+ return bt_readpage (bt, page, page_no);
+}
+