@@ -81,7 +81,9 @@ extern int cacheflush(char *addr, int nbytes, int cache);
81
81
82
82
#if defined(__linux ) && !defined(MDB_FDATASYNC_WORKS )
83
83
/** fdatasync is broken on ext3/ext4fs on older kernels, see
84
- * description in #mdb_env_open2 comments
84
+ * description in #mdb_env_open2 comments. You can safely
85
+ * define MDB_FDATASYNC_WORKS if this code will only be run
86
+ * on kernels 3.6 and newer.
85
87
*/
86
88
#define BROKEN_FDATASYNC
87
89
#endif
@@ -1102,6 +1104,8 @@ struct MDB_env {
1102
1104
#define MDB_ENV_ACTIVE 0x20000000U
1103
1105
/** me_txkey is set */
1104
1106
#define MDB_ENV_TXKEY 0x10000000U
1107
+ /** fdatasync is unreliable */
1108
+ #define MDB_FSYNCONLY 0x08000000U
1105
1109
uint32_t me_flags ; /**< @ref mdb_env */
1106
1110
unsigned int me_psize ; /**< DB page size, inited from me_os_psize */
1107
1111
unsigned int me_os_psize ; /**< OS page size, from #GET_PAGESIZE */
@@ -1148,9 +1152,6 @@ struct MDB_env {
1148
1152
#elif defined(MDB_USE_POSIX_SEM )
1149
1153
sem_t * me_rmutex ; /* Shared mutexes are not supported */
1150
1154
sem_t * me_wmutex ;
1151
- #endif
1152
- #ifdef BROKEN_FDATASYMC
1153
- int me_fsynconly ; /**< fdatasync is unreliable */
1154
1155
#endif
1155
1156
void * me_userctx ; /**< User-settable context */
1156
1157
MDB_assert_func * me_assert_func ; /**< Callback for assertion failures */
@@ -2325,7 +2326,7 @@ mdb_env_sync(MDB_env *env, int force)
2325
2326
#endif
2326
2327
} else {
2327
2328
#ifdef BROKEN_FDATASYNC
2328
- if (env -> me_fsynconly ) {
2329
+ if (env -> me_flags & MDB_FSYNCONLY ) {
2329
2330
if (fsync (env -> me_fd ))
2330
2331
rc = ErrCode ();
2331
2332
} else
@@ -3931,7 +3932,7 @@ mdb_env_open2(MDB_env *env)
3931
3932
} else { /* 4.x and newer is OK */
3932
3933
break ;
3933
3934
}
3934
- env -> me_fsynconly = 1 ;
3935
+ env -> me_flags |= MDB_FSYNCONLY ;
3935
3936
break ;
3936
3937
}
3937
3938
}
0 commit comments