Index: file_io/win32/dir.c
===================================================================
--- file_io/win32/dir.c	(revision 1557715)
+++ file_io/win32/dir.c	(working copy)
@@ -316,8 +316,8 @@ static apr_status_t dir_make_parent(char *path,
     if (APR_STATUS_IS_ENOENT(rv)) { /* Missing an intermediate dir */
         rv = dir_make_parent(path, perm, pool);
 
-        if (rv == APR_SUCCESS) {
-            rv = apr_dir_make (path, perm, pool); /* And complete the path */
+        if (rv == APR_SUCCESS || APR_STATUS_IS_EEXIST(rv)) {
+            rv = apr_dir_make(path, perm, pool); /* And complete the path */
         }
     }
 
@@ -338,21 +338,23 @@ APR_DECLARE(apr_status_t) apr_dir_make_recursive(c
         
         rv = apr_filepath_merge(&dir, "", path, APR_FILEPATH_NATIVE, pool);
 
-        if (rv == APR_SUCCESS)
-            rv = dir_make_parent(dir, perm, pool); /* Make intermediate dirs */
+        if (rv != APR_SUCCESS)
+            return rv;
+
+        rv = dir_make_parent(dir, perm, pool); /* Make intermediate dirs */
         
-        if (rv == APR_SUCCESS)
+        if (rv == APR_SUCCESS || APR_STATUS_IS_EEXIST(rv)) {
             rv = apr_dir_make (dir, perm, pool);   /* And complete the path */
+
+            if (APR_STATUS_IS_EEXIST(rv)) {
+                rv = APR_SUCCESS; /* Timing issue */
+            }
+        }
     }
+    else if (APR_STATUS_IS_EEXIST(rv)) {
+        rv = APR_SUCCESS; /* Timing issue */
+    }
 
-    /*
-     * It's OK if PATH exists. Timing issues can lead to the second
-     * apr_dir_make being called on existing dir, therefore this check
-     * has to come last.
-     */
-    if (APR_STATUS_IS_EEXIST(rv))
-        return APR_SUCCESS;
-
     return rv;
 }
 
