+static void cf_commit_flat (CFile cf)
+{
+ int *fp;
+ int hno;
+ int i, vno = 0;
+
+ fp = xmalloc (HASH_BSIZE);
+ for (hno = cf->head.next_bucket; hno < cf->head.flat_bucket; hno++)
+ {
+ mf_read (cf->hash_mf, hno, 0, 0, fp);
+ for (i = 0; i < (HASH_BSIZE/sizeof(int)); i++)
+ {
+ if (fp[i])
+ {
+ if (!mf_read (cf->block_mf, fp[i], 0, 0, cf->iobuf))
+ {
+ logf (LOG_FATAL, "read commit block at %d (->%d)",
+ fp[i], vno);
+ exit (1);
+ }
+ mf_write (cf->rmf, vno, 0, 0, cf->iobuf);
+ }
+ vno++;
+ }
+ }
+ xfree (fp);
+}
+
+void cf_commit (CFile cf)
+{
+
+ if (cf->bucket_in_memory)
+ {
+ logf (LOG_FATAL, "Cannot commit potential dirty cache");
+ exit (1);
+ }
+ if (cf->head.state == 1)
+ cf_commit_hash (cf);
+ else if (cf->head.state == 2)
+ cf_commit_flat (cf);
+}
+