diff --git a/lib/mcpu.py b/lib/mcpu.py
index 7b910fda7a1778e8c04f212039de8dc9aba9b5c5..5bcfc273fa62fd6781a157e2e65c710f86889e61 100644
--- a/lib/mcpu.py
+++ b/lib/mcpu.py
@@ -221,7 +221,7 @@ class Processor(object):
     self.rpc = rpc.RpcRunner(context.cfg)
     self.hmclass = HooksMaster
 
-  def _ReportLocks(self, level, names, shared, acquired):
+  def _ReportLocks(self, level, names, shared, timeout, acquired, result):
     """Reports lock operations.
 
     @type level: int
@@ -229,18 +229,29 @@ class Processor(object):
     @type names: list or string
     @param names: Lock names
     @type shared: bool
-    @param shared: Whether the lock should be acquired in shared mode
+    @param shared: Whether the locks should be acquired in shared mode
+    @type timeout: None or float
+    @param timeout: Timeout for acquiring the locks
     @type acquired: bool
-    @param acquired: Whether the lock has already been acquired
+    @param acquired: Whether the locks have already been acquired
+    @type result: None or set
+    @param result: Result from L{locking.GanetiLockManager.acquire}
 
     """
     parts = []
 
     # Build message
     if acquired:
-      parts.append("acquired")
+      if result is None:
+        parts.append("timeout")
+      else:
+        parts.append("acquired")
     else:
       parts.append("waiting")
+      if timeout is None:
+        parts.append("blocking")
+      else:
+        parts.append("timeout=%0.6fs" % timeout)
 
     parts.append(locking.LEVEL_NAMES[level])
 
@@ -263,6 +274,28 @@ class Processor(object):
     if self._cbs:
       self._cbs.ReportLocks(msg)
 
+  def _AcquireLocks(self, level, names, shared, timeout):
+    """Acquires locks via the Ganeti lock manager.
+
+    @type level: int
+    @param level: Lock level
+    @type names: list or string
+    @param names: Lock names
+    @type shared: bool
+    @param shared: Whether the locks should be acquired in shared mode
+    @type timeout: None or float
+    @param timeout: Timeout for acquiring the locks
+
+    """
+    self._ReportLocks(level, names, shared, timeout, False, None)
+
+    acquired = self.context.glm.acquire(level, names, shared=shared,
+                                        timeout=timeout)
+
+    self._ReportLocks(level, names, shared, timeout, True, acquired)
+
+    return acquired
+
   def _ExecLU(self, lu):
     """Logical Unit execution sequence.
 
@@ -328,13 +361,8 @@ class Processor(object):
           # Acquiring locks
           needed_locks = lu.needed_locks[level]
 
-          self._ReportLocks(level, needed_locks, share, False)
-          acquired = self.context.glm.acquire(level,
-                                              needed_locks,
-                                              shared=share,
-                                              timeout=calc_timeout())
-          # TODO: Report timeout
-          self._ReportLocks(level, needed_locks, share, True)
+          acquired = self._AcquireLocks(level, needed_locks, share,
+                                        calc_timeout())
 
           if acquired is None:
             raise _LockAcquireTimeout()
@@ -392,22 +420,11 @@ class Processor(object):
 
       while True:
         try:
-          self._ReportLocks(locking.LEVEL_CLUSTER, [locking.BGL],
-                            not lu_class.REQ_BGL, False)
-          try:
-            # Acquire the Big Ganeti Lock exclusively if this LU requires it,
-            # and in a shared fashion otherwise (to prevent concurrent run with
-            # an exclusive LU.
-            acquired_bgl = self.context.glm.acquire(locking.LEVEL_CLUSTER,
-                                                    [locking.BGL],
-                                                    shared=not lu_class.REQ_BGL,
-                                                    timeout=calc_timeout())
-          finally:
-            # TODO: Report timeout
-            self._ReportLocks(locking.LEVEL_CLUSTER, [locking.BGL],
-                              not lu_class.REQ_BGL, True)
-
-          if acquired_bgl is None:
+          # Acquire the Big Ganeti Lock exclusively if this LU requires it,
+          # and in a shared fashion otherwise (to prevent concurrent run with
+          # an exclusive LU.
+          if self._AcquireLocks(locking.LEVEL_CLUSTER, locking.BGL,
+                                not lu_class.REQ_BGL, calc_timeout()) is None:
             raise _LockAcquireTimeout()
 
           try: