]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb2/open.c
tdb2: save open_flags instead of mmap_flags.
[ccan] / ccan / tdb2 / open.c
index daa83a334c44a39db4dad37c77e0090fee858769..83a83e0ba578b75e873c7900a140f08b7cf00b22 100644 (file)
@@ -369,6 +369,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
        tdb->log_fn = NULL;
        tdb->transaction = NULL;
        tdb->access = NULL;
+       tdb->open_flags = open_flags;
        tdb->last_error = TDB_SUCCESS;
        tdb->file = NULL;
        tdb->lock_fn = tdb_fcntl_lock;
@@ -416,11 +417,9 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
 
        if ((open_flags & O_ACCMODE) == O_RDONLY) {
                tdb->read_only = true;
-               tdb->mmap_flags = PROT_READ;
                openlock = F_RDLCK;
        } else {
                tdb->read_only = false;
-               tdb->mmap_flags = PROT_READ | PROT_WRITE;
                openlock = F_WRLCK;
        }
 
@@ -532,6 +531,12 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
                                           name, (long long)hdr.version);
                        goto fail;
                }
+       } else if (tdb->flags & TDB_CONVERT) {
+               ecode = tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
+                                  "tdb_open:"
+                                  " %s does not need TDB_CONVERT",
+                                  name);
+               goto fail;
        }
 
        tdb_convert(tdb, &hdr, sizeof(hdr));
@@ -561,7 +566,9 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
        tdb_unlock_open(tdb, openlock);
 
        /* This make sure we have current map_size and mmap. */
-       tdb->methods->oob(tdb, tdb->file->map_size + 1, true);
+       ecode = tdb->methods->oob(tdb, tdb->file->map_size + 1, true);
+       if (unlikely(ecode != TDB_SUCCESS))
+               goto fail;
 
        /* Now it's fully formed, recover if necessary. */
        berr = tdb_needs_recovery(tdb);