From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laszlo Ersek Subject: Re: [edk2] [PATCH v2] OvmfPkg: XenPvBlkDxe: handle empty cdrom drives Date: Wed, 21 Oct 2015 14:45:23 +0200 Message-ID: <562788E3.4080408@redhat.com> References: <1445427562-21121-1-git-send-email-stefano.stabellini@eu.citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1445427562-21121-1-git-send-email-stefano.stabellini@eu.citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" To: Stefano Stabellini , edk2-devel@ml01.01.org Cc: fabio.fantoni@m2r.biz, xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org On 10/21/15 13:39, Stefano Stabellini wrote: > 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 > error instead from XenPvBlockFrontInitialization(). 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 > > --- > Changes in v2: > - better commit message > - return EFI_DEVICE_ERROR instead of EFI_NO_MEDIA > - check the return status of XenBusIo->XsBackendRead > --- > OvmfPkg/XenPvBlkDxe/BlockFront.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/OvmfPkg/XenPvBlkDxe/BlockFront.c b/OvmfPkg/XenPvBlkDxe/BlockFront.c > index 256ac55..d07e980 100644 > --- a/OvmfPkg/XenPvBlkDxe/BlockFront.c > +++ b/OvmfPkg/XenPvBlkDxe/BlockFront.c > @@ -169,6 +169,7 @@ XenPvBlockFrontInitialization ( > XEN_BLOCK_FRONT_DEVICE *Dev; > XenbusState State; > UINT64 Value; > + CHAR8 *Params; > > ASSERT (NodeName != NULL); > > @@ -186,6 +187,20 @@ XenPvBlockFrontInitialization ( > } > FreePool (DeviceType); > > + if (Dev->MediaInfo.CdRom) { > + Status = XenBusIo->XsBackendRead (XenBusIo, XST_NIL, "params", (VOID**)&Params); > + if (Status != XENSTORE_STATUS_SUCCESS) { > + DEBUG ((EFI_D_ERROR, "%a: Failed to read params (%d)\n", __FUNCTION__, Status)); > + goto Error; > + } > + if (AsciiStrLen (Params) == 0 || AsciiStrCmp (Params, "aio:") == 0) { > + FreePool (Params); > + DEBUG ((EFI_D_INFO, "%a: Empty cdrom\n", __FUNCTION__)); > + 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", > Reviewed-by: Laszlo Ersek I test-built this for X64 and Ia32, and then committed it to SVN as rev 18651. Thanks! Laszlo