Empty cdroms are not going to connect, avoid waiting for the backend to
switch to state 4, which is never going to happen, and return
EFI_NO_MEDIA instead. Detect an empty cdrom by looking at the "params"
node on xenstore, which is set to  "" or "aio:" for empty drives by libxl.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Stefano Stabellini <stefano.stabell...@eu.citrix.com>

diff --git a/OvmfPkg/XenPvBlkDxe/BlockFront.c b/OvmfPkg/XenPvBlkDxe/BlockFront.c
index 256ac55..5a52a03 100644
--- a/OvmfPkg/XenPvBlkDxe/BlockFront.c
+++ b/OvmfPkg/XenPvBlkDxe/BlockFront.c
@@ -169,6 +169,8 @@ XenPvBlockFrontInitialization (
   XEN_BLOCK_FRONT_DEVICE *Dev;
   XenbusState State;
   UINT64 Value;
+  EFI_STATUS Ret = EFI_DEVICE_ERROR;
+  CHAR8 *Params;
 
   ASSERT (NodeName != NULL);
 
@@ -186,6 +188,17 @@ XenPvBlockFrontInitialization (
   }
   FreePool (DeviceType);
 
+  if (Dev->MediaInfo.CdRom) {
+    XenBusIo->XsBackendRead (XenBusIo, XST_NIL, "params", (VOID**)&Params);
+    if (AsciiStrLen (Params) == 0 || AsciiStrCmp (Params, "aio:") == 0) {
+      FreePool (Params);
+      DEBUG ((EFI_D_INFO, "XenPvBlk: Empty cdrom\n"));
+      Ret = EFI_NO_MEDIA;
+      goto Error;
+    }
+    FreePool (Params);
+  }
+
   Status = XenBusReadUint64 (XenBusIo, "backend-id", FALSE, &Value);
   if (Status != XENSTORE_STATUS_SUCCESS || Value > MAX_UINT16) {
     DEBUG ((EFI_D_ERROR, "XenPvBlk: Failed to get backend-id (%d)\n",
@@ -318,7 +331,7 @@ AbortTransaction:
   XenBusIo->XsTransactionEnd (XenBusIo, &Transaction, TRUE);
 Error:
   XenPvBlockFree (Dev);
-  return EFI_DEVICE_ERROR;
+  return Ret;
 }
 
 VOID

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

Reply via email to