On BY_DRIVER, Jeff reached the conclusion that we can't open the BLOCK_IO protocol with BY_DRIVER since it's already owned by DiskIoDxe. The finding makes sense and is consistent with FatPkg's behaviour. As for the GET_PROTOCOL issue, feel free to send a patch ;)
On Sun, Sep 12, 2021 at 11:40 AM Marvin Häuser <mhaeu...@posteo.de> wrote: > > On 11/09/2021 00:11, Jeff Brasen via groups.io wrote: > > A couple of improvements to improve performance. > > Add check to return ACCESS_DENIED if already connected > > Add check to verify superblock magic during supported to reduce start calls > > > > Signed-off-by: Jeff Brasen <jbra...@nvidia.com> > > --- > > Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h | 14 +++++++ > > Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c | 54 +++++++++++++++++++++------ > > Features/Ext4Pkg/Ext4Dxe/Superblock.c | 35 +++++++++++++++++ > > 3 files changed, 92 insertions(+), 11 deletions(-) > > > > diff --git a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h > > b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h > > index 64eab455db..a9b932ed52 100644 > > --- a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h > > +++ b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h > > @@ -1117,4 +1117,18 @@ Ext4GetVolumeName ( > > OUT UINTN *VolNameLen > > ); > > > > +/** > > + Checks the superblock's magic value. > > + > > + @param[in] DiskIo Pointer to the DiskIo. > > + @param[in] BlockIo Pointer to the BlockIo. > > + > > + @returns Whether the partition has a valid EXT4 superblock magic value. > > +**/ > > +BOOLEAN > > +Ext4SuperblockCheckMagic ( > > + IN EFI_DISK_IO_PROTOCOL *DiskIo, > > + IN EFI_BLOCK_IO_PROTOCOL *BlockIo > > + ); > > + > > #endif > > diff --git a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c > > b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c > > index ea2e048d77..d9fbe9ea78 100644 > > --- a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c > > +++ b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c > > @@ -631,7 +631,6 @@ Ext4Unload ( > > @retval EFI_ACCESS_DENIED The device specified by > > ControllerHandle and > > RemainingDevicePath is already being > > managed by a different > > driver or an application that requires > > exclusive access. > > - Currently not implemented. > > @retval EFI_UNSUPPORTED The device specified by > > ControllerHandle and > > RemainingDevicePath is not supported > > by the driver specified by This. > > **/ > > @@ -643,32 +642,65 @@ Ext4IsBindingSupported ( > > IN EFI_DEVICE_PATH *RemainingDevicePath OPTIONAL > > ) > > { > > - // Note to self: EFI_OPEN_PROTOCOL_TEST_PROTOCOL lets us not close the > > - // protocol and ignore the output argument entirely > > + EFI_STATUS Status; > > + EFI_DISK_IO_PROTOCOL *DiskIo; > > + EFI_BLOCK_IO_PROTOCOL *BlockIo; > > > > - EFI_STATUS Status; > > + DiskIo = NULL; > > + BlockIo = NULL; > > > > + // > > + // Open the IO Abstraction(s) needed to perform the supported test > > + // > > Status = gBS->OpenProtocol ( > > ControllerHandle, > > &gEfiDiskIoProtocolGuid, > > - NULL, > > - BindingProtocol->ImageHandle, > > + (VOID **) &DiskIo, > > + BindingProtocol->DriverBindingHandle, > > ControllerHandle, > > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > > + EFI_OPEN_PROTOCOL_BY_DRIVER > > ); > > > > if (EFI_ERROR (Status)) { > > return Status; > > } > > - > > + // > > + // Open the IO Abstraction(s) needed to perform the supported test > > + // > > Status = gBS->OpenProtocol ( > > ControllerHandle, > > &gEfiBlockIoProtocolGuid, > > - NULL, > > - BindingProtocol->ImageHandle, > > + (VOID **) &BlockIo, > > + BindingProtocol->DriverBindingHandle, > > ControllerHandle, > > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > > + EFI_OPEN_PROTOCOL_GET_PROTOCOL > > ); > > + > > + if (!EFI_ERROR (Status)) { > > + if (!Ext4SuperblockCheckMagic (DiskIo, BlockIo)) { > > + Status = EFI_UNSUPPORTED; > > + } > > + } > > + > > + // > > + // Close the I/O Abstraction(s) used to perform the supported test > > + // > > + if (DiskIo != NULL) { > > + gBS->CloseProtocol ( > > + ControllerHandle, > > + &gEfiDiskIoProtocolGuid, > > + BindingProtocol->DriverBindingHandle, > > + ControllerHandle > > + ); > > + } > > + if (BlockIo != NULL) { > > + gBS->CloseProtocol ( > > + ControllerHandle, > > + &gEfiBlockIoProtocolGuid, > > + BindingProtocol->DriverBindingHandle, > > + ControllerHandle > > + ); > > + } > > GET_PROTOCOL protocols are not to be closed, I guess this was missed > when there was still the question whether to use BY_DRIVER for BlockIo. > > Best regards, > Marvin > > > return Status; > > } > > > > diff --git a/Features/Ext4Pkg/Ext4Dxe/Superblock.c > > b/Features/Ext4Pkg/Ext4Dxe/Superblock.c > > index c321d8c3d8..0c965415c5 100644 > > --- a/Features/Ext4Pkg/Ext4Dxe/Superblock.c > > +++ b/Features/Ext4Pkg/Ext4Dxe/Superblock.c > > @@ -34,6 +34,41 @@ STATIC CONST UINT32 gSupportedIncompatFeat = > > // this is desired, it's fairly trivial to look for EFI_VOLUME_CORRUPTED > > // references and add some Ext4SignalCorruption function + function call. > > > > +/** > > + Checks the superblock's magic value. > > + > > + @param[in] DiskIo Pointer to the DiskIo. > > + @param[in] BlockIo Pointer to the BlockIo. > > + > > + @returns Whether the partition has a valid EXT4 superblock magic value. > > +**/ > > +BOOLEAN > > +Ext4SuperblockCheckMagic ( > > + IN EFI_DISK_IO_PROTOCOL *DiskIo, > > + IN EFI_BLOCK_IO_PROTOCOL *BlockIo > > + ) > > +{ > > + UINT16 Magic; > > + EFI_STATUS Status; > > + > > + Status = DiskIo->ReadDisk ( > > + DiskIo, > > + BlockIo->Media->MediaId, > > + EXT4_SUPERBLOCK_OFFSET + OFFSET_OF (EXT4_SUPERBLOCK, > > s_magic), > > + sizeof (Magic), > > + &Magic > > + ); > > + if (EFI_ERROR (Status)) { > > + return FALSE; > > + } > > + > > + if (Magic != EXT4_SIGNATURE) { > > + return FALSE; > > + } > > + > > + return TRUE; > > +} > > + > > /** > > Does brief validation of the ext4 superblock. > > > -- Pedro Falcato -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#80565): https://edk2.groups.io/g/devel/message/80565 Mute This Topic: https://groups.io/mt/85521568/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-