Index: /trunk/include/VBox/settings.h
===================================================================
--- /trunk/include/VBox/settings.h	(revision 29479)
+++ /trunk/include/VBox/settings.h	(revision 29480)
@@ -764,5 +764,5 @@
           ulPortCount(2),
           ulInstance(0),
-          ioBackendType(IoBackendType_Buffered),
+          fUseHostIOCache(true),
           lIDE0MasterEmulationPort(0),
           lIDE0SlaveEmulationPort(0),
@@ -778,5 +778,5 @@
     uint32_t                ulPortCount;
     uint32_t                ulInstance;
-    IoBackendType_T         ioBackendType;
+    bool                    fUseHostIOCache;
 
     // only for when controllerType == StorageControllerType_IntelAhci:
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 29479)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 29480)
@@ -447,5 +447,5 @@
                  "                            [--sataideemulation<1-4> <1-30>]\n"
                  "                            [--sataportcount <1-30>]\n"
-                 "                            [--iobackend Buffered|Unbuffered]\n"
+                 "                            [--hostiocache on|off]\n"
                  "                            [--remove]\n"
                  "\n");
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageStorageController.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageStorageController.cpp	(revision 29479)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageStorageController.cpp	(revision 29480)
@@ -653,5 +653,5 @@
     { "--sataportcount",    'p', RTGETOPT_REQ_UINT32 },
     { "--remove",           'r', RTGETOPT_REQ_NOTHING },
-    { "--iobackend",        'i', RTGETOPT_REQ_STRING },
+    { "--hostiocache",      'i', RTGETOPT_REQ_STRING },
 };
 
@@ -663,5 +663,5 @@
     const char       *pszBusType     = NULL;
     const char       *pszCtlType     = NULL;
-    const char       *pszIoBackend   = NULL;
+    const char       *pszHostIOCache = NULL;
     ULONG             satabootdev    = ~0U;
     ULONG             sataidedev     = ~0U;
@@ -732,5 +732,5 @@
             case 'i':
             {
-                pszIoBackend = ValueUnion.psz;
+                pszHostIOCache = ValueUnion.psz;
                 break;
             }
@@ -921,24 +921,24 @@
         }
 
-        if (   pszIoBackend
+        if (   pszHostIOCache
             && SUCCEEDED(rc))
         {
-                ComPtr<IStorageController> ctl;
-
-                CHECK_ERROR(machine, GetStorageControllerByName(Bstr(pszCtl), ctl.asOutParam()));
-
-                if (!RTStrICmp(pszIoBackend, "buffered"))
-                {
-                    CHECK_ERROR(ctl, COMSETTER(IoBackend)(IoBackendType_Buffered));
-                }
-                else if (!RTStrICmp(pszIoBackend, "unbuffered"))
-                {
-                    CHECK_ERROR(ctl, COMSETTER(IoBackend)(IoBackendType_Unbuffered));
-                }
-                else
-                {
-                    errorArgument("Invalid --type argument '%s'", pszIoBackend);
-                    rc = E_FAIL;
-                }
+            ComPtr<IStorageController> ctl;
+
+            CHECK_ERROR(machine, GetStorageControllerByName(Bstr(pszCtl), ctl.asOutParam()));
+
+            if (!RTStrICmp(pszHostIOCache, "on"))
+            {
+                CHECK_ERROR(ctl, COMSETTER(UseHostIOCache)(TRUE));
+            }
+            else if (!RTStrICmp(pszHostIOCache, "off"))
+            {
+                CHECK_ERROR(ctl, COMSETTER(UseHostIOCache)(FALSE));
+            }
+            else
+            {
+                errorArgument("Invalid --hostiocache argument '%s'", pszHostIOCache);
+                rc = E_FAIL;
+            }
         }
     }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/vm/VBoxVMSettingsHD.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/vm/VBoxVMSettingsHD.cpp	(revision 29479)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/vm/VBoxVMSettingsHD.cpp	(revision 29480)
@@ -1796,7 +1796,5 @@
         QUuid ctrId = QUuid (mStorageModel->data (ctrIndex, StorageModel::R_ItemId).toString());
 
-        bool useIoCache = true;
-        if (controller.GetIoBackend() == KIoBackendType_Unbuffered)
-            useIoCache = false;
+        bool useIoCache = controller.GetUseHostIOCache();
 
         mStorageModel->setData (ctrIndex, useIoCache, StorageModel::R_CtrIoCache);
@@ -1844,5 +1842,5 @@
         CStorageController ctr = mMachine.AddStorageController (ctrName, ctrBusType);
         ctr.SetControllerType (ctrType);
-        ctr.SetIoBackend(useIoCache ? KIoBackendType_Buffered : KIoBackendType_Unbuffered);
+        ctr.SetUseHostIOCache(useIoCache);
         int maxUsedPort = -1;
         for (int j = 0; j < mStorageModel->rowCount (ctrIndex); ++ j)
Index: /trunk/src/VBox/Main/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 29479)
+++ /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 29480)
@@ -3215,6 +3215,6 @@
     rc = ctrl->COMGETTER(Instance)(&uInstance);
     AssertComRC(rc);
-    IoBackendType_T enmIoBackend;
-    rc = ctrl->COMGETTER(IoBackend)(&enmIoBackend);
+    BOOL fUseHostIOCache;
+    rc = ctrl->COMGETTER(UseHostIOCache)(&fUseHostIOCache);
     AssertComRC(rc);
 
@@ -3229,8 +3229,18 @@
      */
     PVMREQ pReq;
-    int vrc = VMR3ReqCall(mpVM, VMCPUID_ANY, &pReq, 0 /* no wait! */, VMREQFLAGS_VBOX_STATUS,
-                          (PFNRT)Console::changeRemovableMedium, 7,
-                          this, pszDevice, uInstance, enmBus, enmIoBackend,
-                          aMediumAttachment, fForce);
+    int vrc = VMR3ReqCall(mpVM,
+                          VMCPUID_ANY,
+                          &pReq,
+                          0 /* no wait! */,
+                          VMREQFLAGS_VBOX_STATUS,
+                          (PFNRT)Console::changeRemovableMedium,
+                          7,
+                          this,
+                          pszDevice,
+                          uInstance,
+                          enmBus,
+                          fUseHostIOCache,
+                          aMediumAttachment,
+                          fForce);
 
     /* leave the lock before waiting for a result (EMT will call us back!) */
@@ -3285,5 +3295,5 @@
                                                  unsigned uInstance,
                                                  StorageBus_T enmBus,
-                                                 IoBackendType_T enmIoBackend,
+                                                 bool fUseHostIOCache,
                                                  IMediumAttachment *aMediumAtt,
                                                  bool fForce)
@@ -3348,5 +3358,5 @@
                                              uInstance,
                                              enmBus,
-                                             enmIoBackend,
+                                             fUseHostIOCache,
                                              false /* fSetupMerge */,
                                              0 /* uMergeSource */,
@@ -4461,6 +4471,6 @@
     rc = ctrl->COMGETTER(Instance)(&uInstance);
     AssertComRC(rc);
-    IoBackendType_T enmIoBackend;
-    rc = ctrl->COMGETTER(IoBackend)(&enmIoBackend);
+    BOOL fUseHostIOCache;
+    rc = ctrl->COMGETTER(UseHostIOCache)(&fUseHostIOCache);
     AssertComRC(rc);
 
@@ -4492,5 +4502,5 @@
                           uInstance,
                           enmBus,
-                          enmIoBackend,
+                          fUseHostIOCache,
                           true /* fSetupMerge */,
                           aSourceIdx,
@@ -4567,5 +4577,5 @@
                           uInstance,
                           enmBus,
-                          enmIoBackend,
+                          fUseHostIOCache,
                           false /* fSetupMerge */,
                           0 /* uMergeSource */,
@@ -7565,5 +7575,5 @@
                                                        unsigned uInstance,
                                                        StorageBus_T enmBus,
-                                                       IoBackendType_T enmIoBackend,
+                                                       bool fUseHostIOCache,
                                                        bool fSetupMerge,
                                                        unsigned uMergeSource,
@@ -7599,5 +7609,5 @@
                                           uInstance,
                                           enmBus,
-                                          enmIoBackend,
+                                          fUseHostIOCache,
                                           fSetupMerge,
                                           uMergeSource,
@@ -7745,5 +7755,5 @@
                 StorageControllerType_T enmController;
                 StorageBus_T enmBus;
-                IoBackendType_T enmIoBackend;
+                BOOL fUseHostIOCache;
 
                 /*
@@ -7769,5 +7779,5 @@
                 if (FAILED(rc))
                     throw rc;
-                rc = controller->COMGETTER(IoBackend)(&enmIoBackend);
+                rc = controller->COMGETTER(UseHostIOCache)(&fUseHostIOCache);
                 if (FAILED(rc))
                     throw rc;
@@ -7788,5 +7798,5 @@
                                       lInstance,
                                       enmBus,
-                                      enmIoBackend,
+                                      fUseHostIOCache,
                                       false /* fSetupMerge */,
                                       0 /* uMergeSource */,
Index: /trunk/src/VBox/Main/ConsoleImpl2.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl2.cpp	(revision 29479)
+++ /trunk/src/VBox/Main/ConsoleImpl2.cpp	(revision 29480)
@@ -1032,6 +1032,6 @@
         rc = ctrls[i]->COMGETTER(Instance)(&ulInstance);                                H();
 
-        IoBackendType_T enmIoBackend;
-        rc = ctrls[i]->COMGETTER(IoBackend)(&enmIoBackend);                             H();
+        BOOL fUseHostIOCache;
+        rc = ctrls[i]->COMGETTER(UseHostIOCache)(&fUseHostIOCache);                     H();
 
         /* /Devices/<ctrldev>/ */
@@ -1226,5 +1226,5 @@
                                                   ulInstance,
                                                   enmBus,
-                                                  enmIoBackend,
+                                                  fUseHostIOCache,
                                                   false /* fSetupMerge */,
                                                   0 /* uMergeSource */,
@@ -2236,5 +2236,5 @@
                                     unsigned uInstance,
                                     StorageBus_T enmBus,
-                                    IoBackendType_T enmIoBackend,
+                                    bool fUseHostIOCache,
                                     bool fSetupMerge,
                                     unsigned uMergeSource,
@@ -2325,5 +2325,5 @@
                       !!fPassthrough,
                       lType,
-                      enmIoBackend,
+                      fUseHostIOCache,
                       fSetupMerge,
                       uMergeSource,
@@ -2356,5 +2356,5 @@
                           bool fPassthrough,
                           DeviceType_T enmType,
-                          IoBackendType_T enmIoBackend,
+                          bool fUseHostIOCache,
                           bool fSetupMerge,
                           unsigned uMergeSource,
@@ -2504,5 +2504,5 @@
             }
 
-            if (enmIoBackend == IoBackendType_Unbuffered)
+            if (!fUseHostIOCache)
             {
                 rc = CFGMR3InsertInteger(pCfg, "UseNewIo", 1);                          RC_CHECK();
Index: /trunk/src/VBox/Main/MachineImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/MachineImpl.cpp	(revision 29479)
+++ /trunk/src/VBox/Main/MachineImpl.cpp	(revision 29480)
@@ -6956,5 +6956,5 @@
         if (FAILED(rc)) return rc;
 
-        rc = pCtl->COMSETTER(IoBackend)(ctlData.ioBackendType);
+        rc = pCtl->COMSETTER(UseHostIOCache)(ctlData.fUseHostIOCache);
         if (FAILED(rc)) return rc;
 
@@ -8033,9 +8033,9 @@
         ctl.ulPortCount = portCount;
 
-        /* Save I/O backend */
-        IoBackendType_T ioBackendType;
-        rc = pCtl->COMGETTER(IoBackend)(&ioBackendType);
+        /* Save fUseHostIOCache */
+        BOOL fUseHostIOCache;
+        rc = pCtl->COMGETTER(UseHostIOCache)(&fUseHostIOCache);
         ComAssertComRCRet(rc, rc);
-        ctl.ioBackendType = ioBackendType;
+        ctl.fUseHostIOCache = !!fUseHostIOCache;
 
         /* Save IDE emulation settings. */
Index: /trunk/src/VBox/Main/StorageControllerImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/StorageControllerImpl.cpp	(revision 29479)
+++ /trunk/src/VBox/Main/StorageControllerImpl.cpp	(revision 29480)
@@ -45,5 +45,5 @@
           mInstance(0),
           mPortCount(2),
-          mIoBackendType(IoBackendType_Buffered),
+          fUseHostIOCache(true),
           mPortIde0Master(0),
           mPortIde0Slave(1),
@@ -62,6 +62,6 @@
     /** Number of usable ports. */
     ULONG mPortCount;
-    /** I/O backend type */
-    IoBackendType_T         mIoBackendType;
+    /** Whether to use the host IO caches. */
+    BOOL fUseHostIOCache;
 
     /** The following is only for the SATA controller atm. */
@@ -145,7 +145,7 @@
     m->bd->mStorageBus = aStorageBus;
     if (aStorageBus != StorageBus_IDE)
-        m->bd->mIoBackendType = IoBackendType_Unbuffered;
+        m->bd->fUseHostIOCache = false;
     else
-        m->bd->mIoBackendType = IoBackendType_Buffered;
+        m->bd->fUseHostIOCache = true;
 
     switch (aStorageBus)
@@ -608,5 +608,5 @@
 }
 
-STDMETHODIMP StorageController::COMGETTER(IoBackend) (IoBackendType_T *aIoBackend)
+STDMETHODIMP StorageController::COMGETTER(UseHostIOCache) (BOOL *fUseHostIOCache)
 {
     AutoCaller autoCaller(this);
@@ -617,10 +617,10 @@
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
 
-    *aIoBackend = m->bd->mIoBackendType;
-
-    return S_OK;
-}
-
-STDMETHODIMP StorageController::COMSETTER(IoBackend) (IoBackendType_T aIoBackend)
+    *fUseHostIOCache = m->bd->fUseHostIOCache;
+
+    return S_OK;
+}
+
+STDMETHODIMP StorageController::COMSETTER(UseHostIOCache) (BOOL fUseHostIOCache)
 {
     AutoCaller autoCaller(this);
@@ -633,8 +633,8 @@
     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
 
-    if (m->bd->mIoBackendType != aIoBackend)
+    if (m->bd->fUseHostIOCache != !!fUseHostIOCache)
     {
         m->bd.backup();
-        m->bd->mIoBackendType = aIoBackend;
+        m->bd->fUseHostIOCache = !!fUseHostIOCache;
 
         alock.release();
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 29479)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 29480)
@@ -1095,5 +1095,5 @@
   </enum>
 
-  <enum
+<!--  <enum
        name="IoBackendType"
        uuid="2a7e16d1-4e6b-4d5d-b0c9-b9bbe6c5b2ad"
@@ -1118,5 +1118,5 @@
     </const>
   </enum>
-
+-->
 
   <!--
@@ -13755,5 +13755,5 @@
   <interface
     name="IStorageController" extends="$unknown"
-    uuid="7635f4ec-8a28-44b5-9223-315a87b710fb"
+    uuid="fd93adc0-bbaa-4256-9e6e-00e29f9151c9"
     wsmap="managed"
   >
@@ -13838,7 +13838,16 @@
     </attribute>
 
-    <attribute name="ioBackend" type="IoBackendType">
-      <desc>
-        The I/O backend to use for the given storage controller.
+    <attribute name="useHostIOCache" type="boolean">
+      <desc>
+        If true, the storage controller emulation will use a dedicated I/O thread, enable the host I/O
+        caches and use synchronous file APIs on the host. This was the only option in the API before
+        VirtualBox 3.2 and is still the default for IDE controllers.
+
+        If false, the host I/O cache will be disabled for image files attached to this storage controller.
+        Instead, the storage controller emulation will use asynchronous I/O APIs on the host. This makes
+        it possible to turn off the host I/O caches because the emulation can handle unaligned access to
+        the file. This should be used on OS X and Linux hosts if a high I/O load is expected or many
+        virtual machines are running at the same time to prevent I/O cache related hangs.
+        This option new with the API of VirtualBox 3.2 and is now the default for non-IDE storage controllers.
       </desc>
     </attribute>
Index: /trunk/src/VBox/Main/include/ConsoleImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 29479)
+++ /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 29480)
@@ -442,5 +442,5 @@
                                unsigned uInstance,
                                StorageBus_T enmBus,
-                               IoBackendType_T enmIoBackend,
+                               bool fUseHostIOCache,
                                bool fSetupMerge,
                                unsigned uMergeSource,
@@ -456,5 +456,5 @@
                      bool fPassthrough,
                      DeviceType_T enmType,
-                     IoBackendType_T enmIoBackend,
+                     bool fUseHostIOCache,
                      bool fSetupMerge,
                      unsigned uMergeSource,
@@ -468,5 +468,5 @@
                                                          unsigned uInstance,
                                                          StorageBus_T enmBus,
-                                                         IoBackendType_T enmIoBackend,
+                                                         bool fUseHostIOCache,
                                                          bool fSetupMerge,
                                                          unsigned uMergeSource,
@@ -479,5 +479,5 @@
                                                    unsigned uInstance,
                                                    StorageBus_T enmBus,
-                                                   IoBackendType_T enmIoBackend,
+                                                   bool fUseHostIOCache,
                                                    IMediumAttachment *aMediumAtt,
                                                    bool fForce);
Index: /trunk/src/VBox/Main/include/StorageControllerImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/StorageControllerImpl.h	(revision 29479)
+++ /trunk/src/VBox/Main/include/StorageControllerImpl.h	(revision 29480)
@@ -73,6 +73,6 @@
     STDMETHOD(COMGETTER(Instance)) (ULONG *aInstance);
     STDMETHOD(COMSETTER(Instance)) (ULONG aInstance);
-    STDMETHOD(COMGETTER(IoBackend)) (IoBackendType_T *aIoBackend);
-    STDMETHOD(COMSETTER(IoBackend)) (IoBackendType_T aIoBackend);
+    STDMETHOD(COMGETTER(UseHostIOCache)) (BOOL *fUseHostIOCache);
+    STDMETHOD(COMSETTER(UseHostIOCache)) (BOOL fUseHostIOCache);
 
     // StorageController methods
Index: /trunk/src/VBox/Main/xml/Settings.cpp
===================================================================
--- /trunk/src/VBox/Main/xml/Settings.cpp	(revision 29479)
+++ /trunk/src/VBox/Main/xml/Settings.cpp	(revision 29480)
@@ -1586,5 +1586,5 @@
                   && (ulPortCount               == s.ulPortCount)
                   && (ulInstance                == s.ulInstance)
-                  && (ioBackendType             == s.ioBackendType)
+                  && (fUseHostIOCache           == s.fUseHostIOCache)
                   && (lIDE0MasterEmulationPort  == s.lIDE0MasterEmulationPort)
                   && (lIDE0SlaveEmulationPort   == s.lIDE0SlaveEmulationPort)
@@ -2077,17 +2077,5 @@
     elmStorageController.getAttributeValue("IDE1SlaveEmulationPort", sctl.lIDE1SlaveEmulationPort);
 
-    Utf8Str strIoBackend;
-    if (elmStorageController.getAttributeValue("IoBackend", strIoBackend))
-    {
-        if (strIoBackend == "Buffered")
-            sctl.ioBackendType = IoBackendType_Buffered;
-        else if (strIoBackend == "Unbuffered")
-            sctl.ioBackendType = IoBackendType_Unbuffered;
-        else
-            throw ConfigFileError(this,
-                                  &elmStorageController,
-                                  N_("Invalid value '%s' in StorageController/@IoBackend"),
-                                  strIoBackend.c_str());
-    }
+    elmStorageController.getAttributeValue("useHostIOCache", sctl.fUseHostIOCache);
 }
 
@@ -3721,15 +3709,6 @@
                 pelmController->setAttribute("Instance", sc.ulInstance);
 
-        if (m->sv >= SettingsVersion_v1_9)
-        {
-            const char *pcszIoBackend;
-            switch (sc.ioBackendType)
-            {
-                case IoBackendType_Unbuffered: pcszIoBackend = "Unbuffered"; break;
-                default: /*case IoBackendType_Buffered:*/ pcszIoBackend = "Buffered"; break;
-            }
-
-            pelmController->setAttribute("IoBackend", pcszIoBackend);
-        }
+        if (m->sv >= SettingsVersion_v1_10)
+            pelmController->setAttribute("useHostIOCache", sc.fUseHostIOCache);
 
         if (sc.controllerType == StorageControllerType_IntelAhci)
@@ -3996,6 +3975,6 @@
                     ++cFloppies;
 
-                // The I/O backend setting is only supported with v.10
-                if (sctl.ioBackendType != IoBackendType_Buffered)
+                // Disabling the host IO cache requires settings version 1.10
+                if (!sctl.fUseHostIOCache)
                 {
                     m->sv = SettingsVersion_v1_10;
