]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Preliminary raw partition support
authorHoward Chu <hyc@openldap.org>
Sun, 21 Feb 2016 18:29:40 +0000 (18:29 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 10 Oct 2020 15:12:33 +0000 (16:12 +0100)
Autodetects that a block device is being used.

libraries/liblmdb/mdb.c

index 7a15943ac52cef076b0d3ff5295dbb0aa188ff7e..df79f398526365395d74158e26f8f60e188db400 100644 (file)
@@ -1584,6 +1584,8 @@ struct MDB_env {
 #define        MDB_ENV_TXKEY   0x10000000U
        /** fdatasync is unreliable */
 #define        MDB_FSYNCONLY   0x08000000U
+       /** using a raw block device */
+#define        MDB_RAWPART             0x04000000U
        uint32_t        me_flags;               /**< @ref mdb_env */
        unsigned int    me_psize;       /**< DB page size, inited from me_os_psize */
        unsigned int    me_os_psize;    /**< OS page size, from #GET_PAGESIZE */
@@ -4456,6 +4458,8 @@ mdb_env_read_header(MDB_env *env, int prev, 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 %"Yu" not a meta page", p->mp_pgno));
                        return MDB_INVALID;
                }
@@ -4812,7 +4816,7 @@ mdb_env_map(MDB_env *env, void *addr)
        {
        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, mmap_flags,
@@ -5945,6 +5949,17 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
                goto leave;
 #endif
        }
+#endif
+#ifndef _WIN32
+       {
+               struct stat st;
+               rc = stat(path, &st);
+               if (rc)
+                       return ErrCode();
+               flags &= ~MDB_RAWPART;
+               if (S_ISBLK(st.st_mode))
+                       flags |= MDB_RAWPART | MDB_NOSUBDIR;
+       }
 #endif
        flags |= MDB_ENV_ACTIVE; /* tell mdb_env_close_active() to clean up */