From 8f0c9e6d39958c68fcc50a29c51ca04f236fd235 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Sun, 21 Feb 2016 18:29:40 +0000 Subject: [PATCH] Preliminary raw partition support Currently requires using new MDB_RAWPART flag on env_open. Should we try to make it automatic instead? Check any path starting with /dev/ to see if it's a block device? --- libraries/liblmdb/lmdb.h | 2 ++ libraries/liblmdb/mdb.c | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/libraries/liblmdb/lmdb.h b/libraries/liblmdb/lmdb.h index a794c9f..a16360e 100644 --- a/libraries/liblmdb/lmdb.h +++ b/libraries/liblmdb/lmdb.h @@ -311,6 +311,8 @@ typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *rel #define MDB_NORDAHEAD 0x800000 /** don't initialize malloc'd memory before writing to datafile */ #define MDB_NOMEMINIT 0x1000000 + /** use a raw partition */ +#define MDB_RAWPART 0x2000000 /** @} */ /** @defgroup mdb_dbi_open Database Flags diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index a366b40..db6a0c0 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -3904,6 +3904,8 @@ mdb_env_read_header(MDB_env *env, MDB_meta *meta) p = (MDB_page *)&pbuf; if (!F_ISSET(p->mp_flags, P_META)) { + if (env->me_flags & MDB_RAWPART) + return ENOENT; DPRINTF(("page %"Y"u not a meta page", p->mp_pgno)); return MDB_INVALID; } @@ -4229,7 +4231,7 @@ mdb_env_map(MDB_env *env, void *addr) int prot = PROT_READ; if (flags & MDB_WRITEMAP) { prot |= PROT_WRITE; - if (ftruncate(env->me_fd, env->me_mapsize) < 0) + if (!(flags & MDB_RAWPART) && ftruncate(env->me_fd, env->me_mapsize) < 0) return ErrCode(); } env->me_map = mmap(addr, env->me_mapsize, prot, MAP_SHARED, @@ -5054,7 +5056,7 @@ fail: */ #define CHANGEABLE (MDB_NOSYNC|MDB_NOMETASYNC|MDB_MAPASYNC|MDB_NOMEMINIT) #define CHANGELESS (MDB_FIXEDMAP|MDB_NOSUBDIR|MDB_RDONLY| \ - MDB_WRITEMAP|MDB_NOTLS|MDB_NOLOCK|MDB_NORDAHEAD) + MDB_WRITEMAP|MDB_NOTLS|MDB_NOLOCK|MDB_NORDAHEAD|MDB_RAWPART) #if VALID_FLAGS & PERSISTENT_FLAGS & (CHANGEABLE|CHANGELESS) # error "Persistent DB flags & env flags overlap, but both go in mm_flags" @@ -5086,6 +5088,8 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode len = strlen(path); if (flags & MDB_NOSUBDIR) { rc = len + sizeof(LOCKSUFF) + len + 1; + } else if (flags & MDB_RAWPART) { + rc = len + sizeof(LOCKSUFF) + len + sizeof("/tmp"); } else { rc = len + sizeof(LOCKNAME) + len + sizeof(DATANAME); } @@ -5096,6 +5100,14 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode dpath = lpath + len + sizeof(LOCKSUFF); sprintf(lpath, "%s" LOCKSUFF, path); strcpy(dpath, path); + } else if (flags & MDB_RAWPART) { + char *ptr; + dpath = lpath + len + sizeof(LOCKSUFF) + sizeof("/tmp"); + sprintf(lpath, "/tmp%s" LOCKSUFF, path); + strcpy(dpath, path); + ptr = lpath + sizeof("/tmp"); + while ((ptr=strchr(ptr, '/'))) + *ptr++ = '_'; } else { dpath = lpath + len + sizeof(LOCKNAME); sprintf(lpath, "%s" LOCKNAME, path);