#include <stdlib.h>
 #include <string.h>
 #include <assert.h>
+#include <err.h>
 #include "logging.h"
 
-struct tdb_layout *new_tdb_layout(void)
+struct tdb_layout *new_tdb_layout(const char *filename)
 {
        struct tdb_layout *layout = malloc(sizeof(*layout));
+       layout->filename = filename;
        layout->num_elems = 0;
        layout->elem = NULL;
        return layout;
 
        /* Write tailer. */
        ((uint8_t *)tdb->map_ptr)[tdb->map_size-1] = last_zone->zone_bits;
+
+       /* Get physical if they asked for it. */
+       if (layout->filename) {
+               int fd = open(layout->filename, O_WRONLY|O_TRUNC|O_CREAT,
+                             0600);
+               if (fd < 0)
+                       err(1, "opening %s for writing", layout->filename);
+               write(fd, tdb->map_ptr, tdb->map_size);
+               close(fd);
+               tdb_close(tdb);
+               /* NOMMAP is for lockcheck. */
+               tdb = tdb_open(layout->filename, TDB_NOMMAP, O_RDWR, 0,
+                              &tap_log_attr);
+       }
        return tdb;
 }
 
        key.dsize = 5;
 
        /* No coalescing can be done due to EOF */
-       layout = new_tdb_layout();
+       layout = new_tdb_layout(NULL);
        tdb_layout_add_zone(layout, zone_bits, false);
        tdb = tdb_layout_get(layout);
        len = layout->elem[1].free.len;
        tdb_close(tdb);
 
        /* No coalescing can be done due to used record */
-       layout = new_tdb_layout();
+       layout = new_tdb_layout(NULL);
        tdb_layout_add_zone(layout, zone_bits, false);
        tdb_layout_add_free(layout, 1024);
        tdb_layout_add_used(layout, key, data, 6);
        tdb_close(tdb);
 
        /* Coalescing can be done due to two free records, then EOF */
-       layout = new_tdb_layout();
+       layout = new_tdb_layout(NULL);
        tdb_layout_add_zone(layout, zone_bits, false);
        tdb_layout_add_free(layout, 1024);
        tdb = tdb_layout_get(layout);
        tdb_close(tdb);
 
        /* Coalescing can be done due to two free records, then data */
-       layout = new_tdb_layout();
+       layout = new_tdb_layout(NULL);
        tdb_layout_add_zone(layout, zone_bits, false);
        tdb_layout_add_free(layout, 1024);
        tdb_layout_add_free(layout, 512);
        tdb_close(tdb);
 
        /* Coalescing can be done due to three free records, then EOF */
-       layout = new_tdb_layout();
+       layout = new_tdb_layout(NULL);
        tdb_layout_add_zone(layout, zone_bits, false);
        tdb_layout_add_free(layout, 1024);
        tdb_layout_add_free(layout, 512);
        tdb_close(tdb);
 
        /* Coalescing across two zones isn't possible. */
-       layout = new_tdb_layout();
+       layout = new_tdb_layout(NULL);
        tdb_layout_add_zone(layout, zone_bits, false);
        tdb_layout_add_zone(layout, zone_bits, true);
        tdb = tdb_layout_get(layout);