diff --git a/core/includes/file.inc b/core/includes/file.inc
index e1219b3..83e6dc9 100644
--- a/core/includes/file.inc
+++ b/core/includes/file.inc
@@ -1497,6 +1497,9 @@ function drupal_basename($uri, $suffix = NULL) {
  * @see mkdir()
  * @see http://drupal.org/node/515192
  * @ingroup php_wrappers
+ *
+ * @todo Update with open_basedir compatible recursion logic from
+ *   \Drupal\Component\PhpStorage\FileStorage::ensureDirectory().
  */
 function drupal_mkdir($uri, $mode = NULL, $recursive = FALSE, $context = NULL) {
   if (!isset($mode)) {
diff --git a/core/install.php b/core/install.php
index b12947a..7152fd8 100644
--- a/core/install.php
+++ b/core/install.php
@@ -36,12 +36,6 @@
   exit;
 }
 
-// Exit early if the PHP option open_basedir is enabled to avoid fatal errors.
-if (ini_get('open_basedir')) {
-  print 'Your PHP installation has open_basedir enabled. Drupal currently requires the open_basedir option to be turned off. See the <a href="http://www.php.net/manual/en/ini.core.php#ini.open-basedir">PHP manual</a> for details of how to do this. This issue is currently <a href="https://drupal.org/node/2110863">under discussion at drupal.org</a>.';
-  exit;
-}
-
 // Start the installer.
 require_once __DIR__ . '/includes/install.core.inc';
 install_drupal();
diff --git a/core/lib/Drupal/Component/PhpStorage/FileStorage.php b/core/lib/Drupal/Component/PhpStorage/FileStorage.php
index dbfa12d..7309115 100644
--- a/core/lib/Drupal/Component/PhpStorage/FileStorage.php
+++ b/core/lib/Drupal/Component/PhpStorage/FileStorage.php
@@ -58,31 +58,34 @@ public function save($name, $code) {
   }
 
   /**
-   * Ensures the root directory exists and has the right permissions.
+   * Ensures the requested directory exists and has the right permissions.
+   *
+   * For compatibility with open_basedir, the requested directory is created
+   * using a recursion logic that is based on the relative directory path/tree:
+   * It works from the end of the path recursively back towards the root
+   * directory, until an existing parent directory is found. From there, the
+   * subdirectories are created.
    *
    * @param string $directory
    *   The directory path.
-   *
    * @param int $mode
    *   The mode, permissions, the directory should have.
+   *
+   * @return bool
+   *   TRUE if the directory exists or has been created, FALSE otherwise.
    */
   protected function ensureDirectory($directory, $mode = 0777) {
-    if (!file_exists($directory)) {
-      // mkdir() obeys umask() so we need to mkdir() and chmod() manually.
-      $parts = explode('/', $directory);
-      $path = '';
-      $delimiter = '';
-      do {
-        $part = array_shift($parts);
-        $path .= $delimiter . $part;
-        $delimiter = '/';
-        // For absolute paths the first part will be empty.
-        if ($part && !file_exists($path)) {
-          mkdir($path);
-          chmod($path, $mode);
-        }
-      } while ($parts);
+    // If the directory exists already, there's nothing to do.
+    // Otherwise, try to create the directory and ensure to set its permissions,
+    // because mkdir() obeys the umask of the current process.
+    if (is_dir($directory) || (mkdir($directory) && chmod($directory, $mode))) {
+      return TRUE;
     }
+    // If the directory does not exist and could not be created above, walk the
+    // requested directory path back up until an existing directory is hit, and
+    // from there, recursively create the sub-directories. If that recursion
+    // succeeds, create the final subdirectory.
+    return $this->ensureDirectory(dirname($directory), $mode) && mkdir($directory);
   }
 
   /**
