diff --git a/lib/backend.py b/lib/backend.py
index c9e9af5ba8fecce9542c0c1599bffb82ca4bea51..c0b5467649b44a1d35b14e0f1df4cecfab10004e 100644
--- a/lib/backend.py
+++ b/lib/backend.py
@@ -1017,14 +1017,16 @@ def CreateBlockDevice(disk, size, owner, on_primary, info):
         crdev.Open()
       clist.append(crdev)
 
-  device = bdev.Create(disk.dev_type, disk.physical_id, clist, size)
+  try:
+    device = bdev.Create(disk.dev_type, disk.physical_id, clist, size)
+  except errors.GenericError, err:
+    return False, "Can't create block device: %s" % str(err)
 
   if on_primary or disk.AssembleOnSecondary():
     if not device.Assemble():
-      errorstring = "Can't assemble device after creation"
+      errorstring = "Can't assemble device after creation, very unusual event"
       logging.error(errorstring)
-      raise errors.BlockDeviceError("%s, very unusual event - check the node"
-                                    " daemon logs" % errorstring)
+      return False, errorstring
     device.SetSyncSpeed(constants.SYNC_SPEED)
     if on_primary or disk.OpenOnSecondary():
       device.Open(force=True)
@@ -1034,7 +1036,7 @@ def CreateBlockDevice(disk, size, owner, on_primary, info):
   device.SetInfo(info)
 
   physical_id = device.unique_id
-  return physical_id
+  return True, physical_id
 
 
 def RemoveBlockDevice(disk):
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 6ddb1f39835eb41eb331ba921f8a9def38154a26..443746bd8d264ccee4e6f4178d1b77bf71519af3 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -3702,13 +3702,14 @@ def _CreateBlockDevOnPrimary(lu, node, instance, device, info):
       _CreateBlockDevOnPrimary(lu, node, instance, child, info)
 
   lu.cfg.SetDiskID(device, node)
-  new_id = lu.rpc.call_blockdev_create(node, device, device.size,
+  result = lu.rpc.call_blockdev_create(node, device, device.size,
                                        instance.name, True, info)
-  if new_id.failed or not new_id.data:
+  msg = result.RemoteFailMsg()
+  if msg:
     raise errors.OpExecError("Can't create block device %s on primary"
-                             " node %s" % (device, node))
+                             " node %s: %s" % (device, node, msg))
   if device.physical_id is None:
-    device.physical_id = new_id
+    device.physical_id = result.data[1]
 
 
 def _CreateBlockDevOnSecondary(lu, node, instance, device, force, info):