]> git.sur5r.net Git - openldap/commitdiff
ITS#7682 In mdb_env_copy retry open if O_DIRECT fails
authorSalvador Ortiz <sog@msg.com.mx>
Thu, 5 Sep 2013 22:36:52 +0000 (17:36 -0500)
committerHoward Chu <hyc@symas.com>
Thu, 5 Sep 2013 23:20:18 +0000 (16:20 -0700)
libraries/liblmdb/mdb.c

index 16db71ecded4388142947fb555511ec65c098ff3..9c5e7389de17f0d71764ac048b80fa44796e7583 100644 (file)
@@ -4246,11 +4246,15 @@ 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
-       newfd = open(lpath, O_WRONLY|O_CREAT|O_EXCL
 #ifdef O_DIRECT
-               |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
-               , 0666);
+       newfd = open(lpath, O_WRONLY|O_CREAT|O_EXCL, 0666);
 #endif
        if (newfd == INVALID_HANDLE_VALUE) {
                rc = ErrCode();