Index: /trunk/src/VBox/Devices/Storage/DevATA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevATA.cpp	(revision 66005)
+++ /trunk/src/VBox/Devices/Storage/DevATA.cpp	(revision 66006)
@@ -1141,4 +1141,28 @@
 
 # ifdef IN_RING3
+
+/**
+ * Enters the lock protecting the controller data against concurrent access.
+ *
+ * @returns nothing.
+ * @param   pCtl        The controller to lock.
+ */
+DECLINLINE(void) ataR3LockEnter(PATACONTROLLER pCtl)
+{
+    STAM_PROFILE_START(&pCtl->StatLockWait, a);
+    PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
+    STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
+}
+
+/**
+ * Leaves the lock protecting the controller against concurrent data access.
+ *
+ * @returns nothing.
+ * @param   pCtl        The controller to unlock.
+ */
+DECLINLINE(void) ataR3LockLeave(PATACONTROLLER pCtl)
+{
+    PDMCritSectLeave(&pCtl->lock);
+}
 
 static uint32_t ataR3GetNSectors(ATADevState *s)
@@ -1360,5 +1384,5 @@
     Assert(!s->cbElementaryTransfer);
 
-    PDMCritSectLeave(&pCtl->lock);
+    ataR3LockLeave(pCtl);
 
     STAM_PROFILE_START(&s->StatFlushes, f);
@@ -1367,7 +1391,5 @@
     STAM_PROFILE_STOP(&s->StatFlushes, f);
 
-    STAM_PROFILE_START(&pCtl->StatLockWait, a);
-    PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-    STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
+    ataR3LockEnter(pCtl);
     ataR3CmdOK(s, 0);
     return false;
@@ -1599,5 +1621,5 @@
     int rc;
 
-    PDMCritSectLeave(&pCtl->lock);
+    ataR3LockLeave(pCtl);
 
     STAM_PROFILE_ADV_START(&s->StatReads, r);
@@ -1616,7 +1638,5 @@
         *pfRedo = ataR3IsRedoSetWarning(s, rc);
 
-    STAM_PROFILE_START(&pCtl->StatLockWait, a);
-    PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-    STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
+    ataR3LockEnter(pCtl);
     return rc;
 }
@@ -1629,5 +1649,5 @@
     int rc;
 
-    PDMCritSectLeave(&pCtl->lock);
+    ataR3LockLeave(pCtl);
 
     STAM_PROFILE_ADV_START(&s->StatWrites, w);
@@ -1654,7 +1674,5 @@
         *pfRedo = ataR3IsRedoSetWarning(s, rc);
 
-    STAM_PROFILE_START(&pCtl->StatLockWait, a);
-    PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-    STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
+    ataR3LockEnter(pCtl);
     return rc;
 }
@@ -1829,5 +1847,5 @@
     Log(("%s: %d sectors at LBA %d\n", __FUNCTION__, cSectors, s->iATAPILBA));
 
-    PDMCritSectLeave(&pCtl->lock);
+    ataR3LockLeave(pCtl);
 
     STAM_PROFILE_ADV_START(&s->StatReads, r);
@@ -1875,7 +1893,5 @@
     STAM_PROFILE_ADV_STOP(&s->StatReads, r);
 
-    STAM_PROFILE_START(&pCtl->StatLockWait, a);
-    PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-    STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
+    ataR3LockEnter(pCtl);
 
     if (RT_SUCCESS(rc))
@@ -1944,5 +1960,5 @@
     }
 
-    PDMCritSectLeave(&pCtl->lock);
+    ataR3LockLeave(pCtl);
 
 # if defined(LOG_ENABLED)
@@ -2017,9 +2033,5 @@
                     LogRel(("PIIX3 ATA: LUN#%d: CD-ROM passthrough split error\n", s->iLUN));
                 atapiR3CmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE);
-                {
-                STAM_PROFILE_START(&pCtl->StatLockWait, a);
-                PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-                STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
-                }
+                ataR3LockEnter(pCtl);
                 return false;
         }
@@ -2102,7 +2114,5 @@
     if (pProf) { STAM_PROFILE_ADV_STOP(pProf, b); }
 
-    STAM_PROFILE_START(&pCtl->StatLockWait, a);
-    PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-    STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
+    ataR3LockEnter(pCtl);
 
     /* Update the LEDs and the read/write statistics. */
@@ -3260,5 +3270,5 @@
                     PCIATAState *pThis = PDMINS_2_DATA(pDevIns, PCIATAState *);
 
-                    PDMCritSectLeave(&pCtl->lock);
+                    ataR3LockLeave(pCtl);
                     rc = VMR3ReqPriorityCallWait(PDMDevHlpGetVM(pDevIns), VMCPUID_ANY,
                                                  (PFNRT)s->pDrvMount->pfnUnmount, 3,
@@ -3272,9 +3282,6 @@
                         AssertRC(rc);
                     }
-                    {
-                        STAM_PROFILE_START(&pCtl->StatLockWait, a);
-                        PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-                        STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
-                    }
+
+                    ataR3LockEnter(pCtl);
                     break;
                 }
@@ -3639,5 +3646,5 @@
     int rc;
 
-    PDMCritSectLeave(&pCtl->lock);
+    ataR3LockLeave(pCtl);
 
     TrimRange.offStart = u64Sector * s->cbSector;
@@ -3653,7 +3660,5 @@
         *pfRedo = ataR3IsRedoSetWarning(s, rc);
 
-    STAM_PROFILE_START(&pCtl->StatLockWait, a);
-    PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-    STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
+    ataR3LockEnter(pCtl);
     return rc;
 }
@@ -4221,5 +4226,5 @@
 #ifdef IN_RING3
                 cBusy = 0;
-                PDMCritSectLeave(&pCtl->lock);
+                ataR3LockLeave(pCtl);
 
 #ifndef RT_OS_WINDOWS
@@ -4251,9 +4256,5 @@
                 RTThreadYield();
 
-                {
-                    STAM_PROFILE_START(&pCtl->StatLockWait, a);
-                    PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-                    STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
-                }
+                ataR3LockEnter(pCtl);
 
                 val = s->uATARegStatus;
@@ -4970,5 +4971,5 @@
      * necessary. This avoids long freezes should the guest access the
      * ATA registers etc. for some reason. */
-    PDMCritSectLeave(&pCtl->lock);
+    ataR3LockLeave(pCtl);
 
     Log2(("%s: %s tx_size=%d elem_tx_size=%d index=%d end=%d\n",
@@ -5028,9 +5029,5 @@
                     cbElementaryTransfer = cbTotalTransfer;
 
-                {
-                STAM_PROFILE_START(&pCtl->StatLockWait, a);
-                PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-                STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
-                }
+                ataR3LockEnter(pCtl);
 
                 /* The RESET handler could have cleared the DMA transfer
@@ -5071,5 +5068,5 @@
                 }
 
-                PDMCritSectLeave(&pCtl->lock);
+                ataR3LockLeave(pCtl);
                 if (RT_UNLIKELY(fRedo))
                     break;
@@ -5084,9 +5081,5 @@
             break;
 
-        {
-        STAM_PROFILE_START(&pCtl->StatLockWait, a);
-        PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-        STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
-        }
+        ataR3LockEnter(pCtl);
 
         if (!(pCtl->BmDma.u8Cmd & BM_CMD_START) || pCtl->fReset)
@@ -5099,13 +5092,8 @@
         }
 
-        PDMCritSectLeave(&pCtl->lock);
-    }
-
-    {
-    STAM_PROFILE_START(&pCtl->StatLockWait, a);
-    PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-    STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
-    }
-
+        ataR3LockLeave(pCtl);
+    }
+
+    ataR3LockEnter(pCtl);
     if (RT_UNLIKELY(fRedo))
         return;
@@ -5228,9 +5216,5 @@
 
         /* Do our work.  */
-        {
-        STAM_PROFILE_START(&pCtl->StatLockWait, a);
-        PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
-        STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
-        }
+        ataR3LockEnter(pCtl);
 
         if (pCtl->uAsyncIOState == ATA_AIO_NEW && !pCtl->fChainedTransfer)
@@ -5425,7 +5409,7 @@
                      * solution has been found. */
                     Log(("%s: delay IRQ hack\n", __FUNCTION__));
-                    PDMCritSectLeave(&pCtl->lock);
+                    ataR3LockLeave(pCtl);
                     RTThreadSleep(pCtl->DelayIRQMillies);
-                    PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS);
+                    ataR3LockEnter(pCtl);
                 }
 
@@ -5634,5 +5618,5 @@
         }
 
-        PDMCritSectLeave(&pCtl->lock);
+        ataR3LockLeave(pCtl);
     }
 
@@ -5779,6 +5763,6 @@
         default:
             AssertMsgFailed(("%s: Unsupported read from port %x size=%d\n", __FUNCTION__, Port, cb));
-            PDMCritSectLeave(&pCtl->lock);
-            return VERR_IOM_IOPORT_UNUSED;
+            rc = VERR_IOM_IOPORT_UNUSED;
+            break;
     }
     PDMCritSectLeave(&pCtl->lock);
