* of the database. The value should be chosen as large as possible,
         * to accommodate future growth of the database.
         * This function may only be called after #mdb_env_create() and before #mdb_env_open().
+        * The size may be changed by closing and reopening the environment.
+        * Any attempt to set a size smaller than the space already consumed
+        * by the environment will be silently changed to the current size of the used space.
         * @param[in] env An environment handle returned by #mdb_env_create()
         * @param[in] size The size in bytes
         * @return A non-zero error value on failure and 0 on success. Some possible
 
                        return i;
                DPUTS("new mdbenv");
                newenv = 1;
-               meta.mm_mapsize = env->me_mapsize > DEFAULT_MAPSIZE ? env->me_mapsize : DEFAULT_MAPSIZE;
        }
 
-       if (env->me_mapsize < meta.mm_mapsize)
-               env->me_mapsize = meta.mm_mapsize;
+       /* Was a mapsize configured? */
+       if (!env->me_mapsize) {
+               /* If this is a new environment, take the default,
+                * else use the size recorded in the existing env.
+                */
+               env->me_mapsize = newenv ? DEFAULT_MAPSIZE : meta.mm_mapsize;
+       } else if (env->me_mapsize < meta.mm_mapsize) {
+               /* If the configured size is smaller, make sure it's
+                * still big enough. Silently round up to minimum if not.
+                */
+               size_t minsize = (meta.mm_last_pg + 1) * meta.mm_psize;
+               if (env->me_mapsize < minsize)
+                       env->me_mapsize = minsize;
+       }
 
 #ifdef _WIN32
        {