[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] XenPvBlk: handle empty cdrom drives
I just want to say that this is one of the best reviews I have ever received, very clear and useful. Thanks Laszlo! On Tue, 20 Oct 2015, Laszlo Ersek wrote: > (1) Please make the subject line say: > > OvmfPkg: XenPvBlkDxe: handle empty cdrom drives > > On 10/20/15 17:03, 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 > > EFI_NO_MEDIA instead. > > (2) I suggest to name the function here that should return EFI_NO_MEDIA > -- XenPvBlockFrontInitialization(). > > (3) Because the return status will ultimately be forwarded outside by > the driver binding's Start() function, if possible we should stick with > status codes listed by the UEFI spec. The relevant section is > > 10.1 EFI Driver Binding Protocol > EFI_DRIVER_BINDING_PROTOCOL.Start() > > So, as long as we are setting the error code manually in > XenPvBlockFrontInitialization() -- ie. not propagating an error code > from another function we call there --, I think we should stick with > EFI_DEVICE_ERROR. > > Sorry that I didn't point this out in my earlier message on qemu-devel. > > > 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.stabellini@xxxxxxxxxxxxx> > > > > 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; > > So this shouldn't be necessary. > > (As a side point I'll mention that initialization of variables with > automatic storage duration is forbidden by the edk2 coding style; > separate assignments are required. I'm aware that this file already > doesn't comply with that, but that's no excuse. :)) > > > + 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) { > > (4) Please verify that XsBackendRead() returns XENSTORE_STATUS_SUCCESS. > I think you can use the "Status" variable for that. > > If the read fails, you should assume one of "cdrom empty" vs. "cdrom not > empty" -- your call. > > ... I briefly considered that maybe XsBackendRead() is guaranteed to set > *Params to \0 on failure, but the typedef docs of the protocol member > function in question (XENBUS_XS_BACKEND_READ in > "OvmfPkg/Include/Protocol/XenBus.h") don't seem to guarantee that, so > please check the return status. > > > + FreePool (Params); > > + DEBUG ((EFI_D_INFO, "XenPvBlk: Empty cdrom\n")); > > (5) If this is a normal / expected condition, then EFI_D_INFO is fine. > If it is a genuine error, then EFI_D_ERROR should be used. I think > EFI_D_INFO is right though. > > (6) Suggest to replace "XenPvBlk" with the "%a" conversion > specification, and pass in __FUNCTION__ as its argument. ("%a" formats > CHAR8 strings, while "%s" formats CHAR16 strings.) > > __FUNCTION__ will expand to "XenPvBlockFrontInitialization", which is > both telling, and allows people with ctags- or cscope-compatible editors > to jump to the function immediately. > > > + Ret = EFI_NO_MEDIA; > > + goto Error; > > See (3) -- I think the goto suffices. > > > + } > > + 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 > > > > See (3) again. > > I'm looking forward to version 2. > > Thanks! > Laszlo > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |