]> git.sur5r.net Git - openldap/blobdiff - libraries/liblmdb/mdb.c
ITS#7682 mdb_env_copy(): Avoid Linux O_DIRECT bug.
[openldap] / libraries / liblmdb / mdb.c
index e5313b0c8516609aa9d78e423f93743127a2b325..46dea53c877d2f0a645d34aaa89345cd801323eb 100644 (file)
@@ -4246,14 +4246,6 @@ mdb_env_copy(MDB_env *env, const char *path)
        newfd = CreateFile(lpath, GENERIC_WRITE, 0, NULL, CREATE_NEW,
                                FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH, NULL);
 #else
-#ifdef O_DIRECT
-       /* The OS supports O_DIRECT, try with it */
-       newfd = open(lpath, O_WRONLY|O_CREAT|O_EXCL|O_DIRECT, 0666);
-       /* But open can fail if O_DIRECT isn't supported by the file system
-        * so retry without the flag
-        */
-       if (newfd == INVALID_HANDLE_VALUE && ErrCode() == EINVAL)
-#endif
        newfd = open(lpath, O_WRONLY|O_CREAT|O_EXCL, 0666);
 #endif
        if (newfd == INVALID_HANDLE_VALUE) {
@@ -4261,6 +4253,11 @@ mdb_env_copy(MDB_env *env, const char *path)
                goto leave;
        }
 
+#ifdef O_DIRECT
+       /* Set O_DIRECT if the file system supports it */
+       if ((rc = fcntl(newfd, F_GETFL)) != -1)
+               (void) fcntl(newfd, F_SETFL, rc | O_DIRECT);
+#endif
 #ifdef F_NOCACHE       /* __APPLE__ */
        rc = fcntl(newfd, F_NOCACHE, 1);
        if (rc) {
@@ -5231,9 +5228,10 @@ mdb_cursor_set(MDB_cursor *mc, MDB_val *key, MDB_val *data,
                if (!mc->mc_top) {
                        /* There are no other pages */
                        mc->mc_ki[mc->mc_top] = 0;
-                       if (op == MDB_SET_RANGE)
+                       if (op == MDB_SET_RANGE) {
+                               rc = 0;
                                goto set1;
-                       else 
+                       } else
                                return MDB_NOTFOUND;
                }
        }
@@ -5298,6 +5296,7 @@ set1:
                        if (rc) {
                                if (op == MDB_GET_BOTH || rc > 0)
                                        return MDB_NOTFOUND;
+                               rc = 0;
                        }
 
                } else {