* [PATCH v3 0/2] ExtPkg Updates @ 2021-09-10 22:11 Jeff Brasen 2021-09-10 22:11 ` [PATCH v3 1/2] Ext4Pkg: Improve Ext4IsBindingSupported() behavior Jeff Brasen ` (3 more replies) 0 siblings, 4 replies; 7+ messages in thread From: Jeff Brasen @ 2021-09-10 22:11 UTC (permalink / raw) To: devel; +Cc: pedro.falcato, Jeff Brasen I have been using the new Ext4Pkg and been pretty successful and it is solving a use case we had. Had a couple updates to propose 1. Changed the implementation of the binding protocol to both check if the driver is already bound to the partition as well as added a really quick check to validate the magic value in supported. This improves performance when you have a large number of non-ext4 partitions on the system. 2. As we are planning on using this for boot support we want to support unclean filesystem states in case the user doesn't reset cleanly. I added a check if the recovery journal is present and if so treat the filesystem as read-only (I know the driver is only RO at this point, but figured if you added write support prior to recovery journal support we would want that). With this everything seems to work great. I can add this under a FeaturePcd if desired as well. Change log v3 - Removed goto flow on binding supported failures Minor code review comments v2 - Minor code review comments v1 - Initial revision Jeff Brasen (2): Ext4Pkg: Improve Ext4IsBindingSupported() behavior Ext4Pkg: Support uncleanly unmounted filesystems Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h | 14 +++++++ Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c | 54 +++++++++++++++++++++------ Features/Ext4Pkg/Ext4Dxe/Superblock.c | 46 +++++++++++++++++++++-- 3 files changed, 99 insertions(+), 15 deletions(-) -- 2.17.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 1/2] Ext4Pkg: Improve Ext4IsBindingSupported() behavior 2021-09-10 22:11 [PATCH v3 0/2] ExtPkg Updates Jeff Brasen @ 2021-09-10 22:11 ` Jeff Brasen 2021-09-12 10:40 ` [edk2-devel] " Marvin Häuser 2021-09-10 22:11 ` [PATCH v3 2/2] Ext4Pkg: Support uncleanly unmounted filesystems Jeff Brasen ` (2 subsequent siblings) 3 siblings, 1 reply; 7+ messages in thread From: Jeff Brasen @ 2021-09-10 22:11 UTC (permalink / raw) To: devel; +Cc: pedro.falcato, Jeff Brasen 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 <jbrasen@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 + ); + } 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. -- 2.17.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [edk2-devel] [PATCH v3 1/2] Ext4Pkg: Improve Ext4IsBindingSupported() behavior 2021-09-10 22:11 ` [PATCH v3 1/2] Ext4Pkg: Improve Ext4IsBindingSupported() behavior Jeff Brasen @ 2021-09-12 10:40 ` Marvin Häuser 2021-09-13 16:35 ` Pedro Falcato 0 siblings, 1 reply; 7+ messages in thread From: Marvin Häuser @ 2021-09-12 10:40 UTC (permalink / raw) To: devel, jbrasen; +Cc: pedro.falcato 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 <jbrasen@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. > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [edk2-devel] [PATCH v3 1/2] Ext4Pkg: Improve Ext4IsBindingSupported() behavior 2021-09-12 10:40 ` [edk2-devel] " Marvin Häuser @ 2021-09-13 16:35 ` Pedro Falcato 0 siblings, 0 replies; 7+ messages in thread From: Pedro Falcato @ 2021-09-13 16:35 UTC (permalink / raw) To: Marvin Häuser; +Cc: edk2-devel-groups-io, Jeff Brasen 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 <mhaeuser@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 <jbrasen@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 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 2/2] Ext4Pkg: Support uncleanly unmounted filesystems 2021-09-10 22:11 [PATCH v3 0/2] ExtPkg Updates Jeff Brasen 2021-09-10 22:11 ` [PATCH v3 1/2] Ext4Pkg: Improve Ext4IsBindingSupported() behavior Jeff Brasen @ 2021-09-10 22:11 ` Jeff Brasen 2021-09-11 0:59 ` [PATCH v3 0/2] ExtPkg Updates Pedro Falcato 2021-09-11 1:02 ` Pedro Falcato 3 siblings, 0 replies; 7+ messages in thread From: Jeff Brasen @ 2021-09-10 22:11 UTC (permalink / raw) To: devel; +Cc: pedro.falcato, Jeff Brasen Support for uncleanly mounted filesystems, if there is a recovery journal mark filesystem as read-only. Signed-off-by: Jeff Brasen <jbrasen@nvidia.com> --- Features/Ext4Pkg/Ext4Dxe/Superblock.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Features/Ext4Pkg/Ext4Dxe/Superblock.c b/Features/Ext4Pkg/Ext4Dxe/Superblock.c index 0c965415c5..9c3f7a9e7b 100644 --- a/Features/Ext4Pkg/Ext4Dxe/Superblock.c +++ b/Features/Ext4Pkg/Ext4Dxe/Superblock.c @@ -18,7 +18,7 @@ STATIC CONST UINT32 gSupportedIncompatFeat = EXT4_FEATURE_INCOMPAT_64BIT | EXT4_FEATURE_INCOMPAT_DIRDATA | EXT4_FEATURE_INCOMPAT_FLEX_BG | EXT4_FEATURE_INCOMPAT_FILETYPE | EXT4_FEATURE_INCOMPAT_EXTENTS | EXT4_FEATURE_INCOMPAT_LARGEDIR | - EXT4_FEATURE_INCOMPAT_MMP; + EXT4_FEATURE_INCOMPAT_MMP | EXT4_FEATURE_INCOMPAT_RECOVER; // Future features that may be nice additions in the future: // 1) Btree support: Required for write support and would speed up lookups in large directories. @@ -89,10 +89,8 @@ Ext4SuperblockValidate ( return FALSE; } - // Is this correct behaviour? Imagine the power cuts out, should the system fail to boot because - // we're scared of touching something corrupt? if ((Sb->s_state & EXT4_FS_STATE_UNMOUNTED) == 0) { - return FALSE; + DEBUG ((DEBUG_WARN, "[ext4] Filesystem was not unmounted cleanly\n")); } return TRUE; @@ -215,6 +213,11 @@ Ext4OpenSuperblock ( return EFI_UNSUPPORTED; } + if (EXT4_HAS_INCOMPAT (Partition, EXT4_FEATURE_INCOMPAT_RECOVER)) { + DEBUG ((DEBUG_WARN, "[ext4] Needs journal recovery, mounting read-only\n")); + Partition->ReadOnly = TRUE; + } + // At the time of writing, it's the only supported checksum. if (Partition->FeaturesCompat & EXT4_FEATURE_RO_COMPAT_METADATA_CSUM && Sb->s_checksum_type != EXT4_CHECKSUM_CRC32C) { -- 2.17.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 0/2] ExtPkg Updates 2021-09-10 22:11 [PATCH v3 0/2] ExtPkg Updates Jeff Brasen 2021-09-10 22:11 ` [PATCH v3 1/2] Ext4Pkg: Improve Ext4IsBindingSupported() behavior Jeff Brasen 2021-09-10 22:11 ` [PATCH v3 2/2] Ext4Pkg: Support uncleanly unmounted filesystems Jeff Brasen @ 2021-09-11 0:59 ` Pedro Falcato 2021-09-11 1:02 ` Pedro Falcato 3 siblings, 0 replies; 7+ messages in thread From: Pedro Falcato @ 2021-09-11 0:59 UTC (permalink / raw) To: Jeff Brasen; +Cc: edk2-devel-groups-io Series Reviewed-by: Pedro Falcato <pedro.falcato@gmail.com> On Fri, Sep 10, 2021 at 11:11 PM Jeff Brasen <jbrasen@nvidia.com> wrote: > > I have been using the new Ext4Pkg and been pretty successful and it is solving a use case we had. > > Had a couple updates to propose > > 1. Changed the implementation of the binding protocol to both check if the driver is already bound > to the partition as well as added a really quick check to validate the magic value in supported. > This improves performance when you have a large number of non-ext4 partitions on the system. > > 2. As we are planning on using this for boot support we want to support unclean filesystem states in > case the user doesn't reset cleanly. I added a check if the recovery journal is present and if so treat > the filesystem as read-only (I know the driver is only RO at this point, but figured if you added write > support prior to recovery journal support we would want that). With this everything seems to work great. > I can add this under a FeaturePcd if desired as well. > > Change log > > v3 - Removed goto flow on binding supported failures > Minor code review comments > v2 - Minor code review comments > v1 - Initial revision > > Jeff Brasen (2): > Ext4Pkg: Improve Ext4IsBindingSupported() behavior > Ext4Pkg: Support uncleanly unmounted filesystems > > Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h | 14 +++++++ > Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c | 54 +++++++++++++++++++++------ > Features/Ext4Pkg/Ext4Dxe/Superblock.c | 46 +++++++++++++++++++++-- > 3 files changed, 99 insertions(+), 15 deletions(-) > > -- > 2.17.1 > -- Pedro Falcato ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 0/2] ExtPkg Updates 2021-09-10 22:11 [PATCH v3 0/2] ExtPkg Updates Jeff Brasen ` (2 preceding siblings ...) 2021-09-11 0:59 ` [PATCH v3 0/2] ExtPkg Updates Pedro Falcato @ 2021-09-11 1:02 ` Pedro Falcato 3 siblings, 0 replies; 7+ messages in thread From: Pedro Falcato @ 2021-09-11 1:02 UTC (permalink / raw) To: Jeff Brasen; +Cc: edk2-devel-groups-io Pushed as to edk2-platforms as 71f334393361d53e805fe9a01e2cf7bc43e909ce and 7872c983ed45de4c9e4e9295aa249e1369913094, respectively. On Fri, Sep 10, 2021 at 11:11 PM Jeff Brasen <jbrasen@nvidia.com> wrote: > > I have been using the new Ext4Pkg and been pretty successful and it is solving a use case we had. > > Had a couple updates to propose > > 1. Changed the implementation of the binding protocol to both check if the driver is already bound > to the partition as well as added a really quick check to validate the magic value in supported. > This improves performance when you have a large number of non-ext4 partitions on the system. > > 2. As we are planning on using this for boot support we want to support unclean filesystem states in > case the user doesn't reset cleanly. I added a check if the recovery journal is present and if so treat > the filesystem as read-only (I know the driver is only RO at this point, but figured if you added write > support prior to recovery journal support we would want that). With this everything seems to work great. > I can add this under a FeaturePcd if desired as well. > > Change log > > v3 - Removed goto flow on binding supported failures > Minor code review comments > v2 - Minor code review comments > v1 - Initial revision > > Jeff Brasen (2): > Ext4Pkg: Improve Ext4IsBindingSupported() behavior > Ext4Pkg: Support uncleanly unmounted filesystems > > Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h | 14 +++++++ > Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c | 54 +++++++++++++++++++++------ > Features/Ext4Pkg/Ext4Dxe/Superblock.c | 46 +++++++++++++++++++++-- > 3 files changed, 99 insertions(+), 15 deletions(-) > > -- > 2.17.1 > -- Pedro Falcato ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-09-13 16:36 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-09-10 22:11 [PATCH v3 0/2] ExtPkg Updates Jeff Brasen 2021-09-10 22:11 ` [PATCH v3 1/2] Ext4Pkg: Improve Ext4IsBindingSupported() behavior Jeff Brasen 2021-09-12 10:40 ` [edk2-devel] " Marvin Häuser 2021-09-13 16:35 ` Pedro Falcato 2021-09-10 22:11 ` [PATCH v3 2/2] Ext4Pkg: Support uncleanly unmounted filesystems Jeff Brasen 2021-09-11 0:59 ` [PATCH v3 0/2] ExtPkg Updates Pedro Falcato 2021-09-11 1:02 ` Pedro Falcato
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox