From nobody Mon Feb 9 11:06:26 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+79665+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+79665+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1629557303; cv=none; d=zohomail.com; s=zohoarc; b=c64PQQWdtOMQ6Kndkst4mq9UesRgC70tSDNAKVEizohQJQLZDhU7jljOBs4WwgrfVkbpugWmHNfKl+9MQJjbbZhfEJwKHaFBuiBnls9f137+hx6BOAaDyVtZXqyX1feP6utQ+mNL4+AABr04xrskP240BX/OSvalzDOVowc0Alk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1629557303; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=M4O88xwlsSefR3HaT43GaAoju4LLYdsRBJRm8isdMU4=; b=IyFb8kkdC26Osx//EbjeeXe4Z2+t6gke6iRrdxUwS5p1706RYFX/NkLbtKZcfW4M7oKsHuHkrPahj0yw2juwFIklGLXHC5FafcNpExYFLo9BaHtaDD9wxaKe/TBDWhJ21LvHAD1Z46lJKTyRS/h/JXF60vPFWLFVvCG6TkzzX38= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+79665+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1629557303832256.2091572951455; Sat, 21 Aug 2021 07:48:23 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id CuRTYY1788612xHXXgQujK2h; Sat, 21 Aug 2021 07:48:23 -0700 X-Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) by mx.groups.io with SMTP id smtpd.web08.11574.1629557302664911308 for ; Sat, 21 Aug 2021 07:48:23 -0700 X-Received: by mail-wr1-f49.google.com with SMTP id r7so18669211wrs.0 for ; Sat, 21 Aug 2021 07:48:22 -0700 (PDT) X-Gm-Message-State: 0aJeK5TRTUpEsymksCkOpvrZx1787277AA= X-Google-Smtp-Source: ABdhPJwRj3SDl8YAUKGiP71URGcbrhsios26tv7J+n6eewBRBtF4Qo1pg4ufgPdduQEdCHJveTfI3w== X-Received: by 2002:adf:f7cf:: with SMTP id a15mr4341863wrq.53.1629557301057; Sat, 21 Aug 2021 07:48:21 -0700 (PDT) X-Received: from PC-PEDRO.lan (bl8-253-151.dsl.telepac.pt. [85.241.253.151]) by smtp.gmail.com with ESMTPSA id j17sm9118036wrt.69.2021.08.21.07.48.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Aug 2021 07:48:20 -0700 (PDT) From: "Pedro Falcato" To: devel@edk2.groups.io Cc: Pedro Falcato , Leif Lindholm , Michael D Kinney , Bret Barkelew Subject: [edk2-devel] [edk2-platforms PATCH v2 4/5] Ext4Pkg: Add handling of EFI_FILE_SYSTEM_VOLUME_LABEL GetInfo(). Date: Sat, 21 Aug 2021 15:47:09 +0100 Message-Id: <20210821144711.39546-5-pedro.falcato@gmail.com> In-Reply-To: <20210821144711.39546-1-pedro.falcato@gmail.com> References: <20210821144711.39546-1-pedro.falcato@gmail.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,pedro.falcato@gmail.com Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1629557303; bh=xb03f0Aliz/u1/UHjaMGn/GCIl1rZ0Mip9iQd9pRFKk=; h=Cc:Date:From:Reply-To:Subject:To; b=ooa5PwEKMJlKl9ner9ztb94z6NJkLEO7Fi0QMLO4PUcM55R5fP1+zjTutNoiBKvNCpi osm0AW64e0rqtMvb+Ti3PVUVvrhS/T/ZIuoI5yFcYfW2syrKYUOmBayPzSV5dbk32/hQq XzIzSvXhLcSoQ3gOEqkIalbWLjRCMKVAZa4= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1629557305251100016 Content-Type: text/plain; charset="utf-8" This commit adds support for EFI_FILE_SYSTEM_VOLUME_LABEL requests in GetInfo(). Cc: Leif Lindholm Cc: Michael D Kinney Cc: Bret Barkelew Signed-off-by: Pedro Falcato --- Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c | 1 - Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h | 17 ++++ Features/Ext4Pkg/Ext4Dxe/File.c | 155 ++++++++++++++++++++++------- 3 files changed, 138 insertions(+), 35 deletions(-) diff --git a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c b/Features/Ext4Pkg/Ext4Dxe/= Ext4Dxe.c index 71360ea894d2..ea2e048d7762 100644 --- a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c +++ b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.c @@ -6,7 +6,6 @@ **/ =20 #include "Ext4Dxe.h" -#include "Uefi/UefiBaseType.h" =20 GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mExt4DriverNameTab= le[] =3D { { diff --git a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h b/Features/Ext4Pkg/Ext4Dxe/= Ext4Dxe.h index db938c25244d..64eab455db4a 100644 --- a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h +++ b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h @@ -1100,4 +1100,21 @@ Ext4CalculateBlockGroupDescChecksum ( #define EXT4_HAS_GDT_CSUM(Partition) \ EXT4_HAS_RO_COMPAT (Partition, EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) =20 +/** + Retrieves the volume name. + + @param[in] Part Pointer to the opened partition. + @param[out] Info Pointer to a CHAR16*. + @param[out] BufferSize Pointer to a UINTN, where the string len= gth + of the name will be put. + + @return Status of the volume name request. +**/ +EFI_STATUS +Ext4GetVolumeName ( + IN EXT4_PARTITION *Partition, + OUT CHAR16 **OutVolName, + OUT UINTN *VolNameLen + ); + #endif diff --git a/Features/Ext4Pkg/Ext4Dxe/File.c b/Features/Ext4Pkg/Ext4Dxe/Fil= e.c index 021d10b1edfb..4ad7cad8dcf5 100644 --- a/Features/Ext4Pkg/Ext4Dxe/File.c +++ b/Features/Ext4Pkg/Ext4Dxe/File.c @@ -35,7 +35,9 @@ Ext4DuplicateFile ( STATIC EFI_STATUS GetPathSegment ( - IN CONST CHAR16 *Path, OUT CHAR16 *PathSegment, OUT UINTN *Length + IN CONST CHAR16 *Path, + OUT CHAR16 *PathSegment, + OUT UINTN *Length ) { CONST CHAR16 *Start; @@ -514,7 +516,9 @@ Ext4SetPosition ( **/ EFI_STATUS Ext4GetFileInfo ( - IN EXT4_FILE *File, OUT EFI_FILE_INFO *Info, IN OUT UINTN *BufferSize + IN EXT4_FILE *File, + OUT EFI_FILE_INFO *Info, + IN OUT UINTN *BufferSize ) { UINTN FileNameLen; @@ -557,35 +561,33 @@ Ext4GetFileInfo ( } =20 /** - Retrieves information about the filesystem and stores it in the EFI_FIL= E_SYSTEM_INFO format. + Retrieves the volume name. =20 @param[in] Part Pointer to the opened partition. - @param[out] Info Pointer to a EFI_FILE_SYSTEM_INFO. - @param[in out] BufferSize Pointer to the buffer size + @param[out] Info Pointer to a CHAR16*. + @param[out] BufferSize Pointer to a UINTN, where the string len= gth + of the name will be put. =20 - @return Status of the file information request. + @return Status of the volume name request. **/ -STATIC EFI_STATUS -Ext4GetFilesystemInfo ( - IN EXT4_PARTITION *Part, OUT EFI_FILE_SYSTEM_INFO *Info, IN OUT UINTN *B= ufferSize +Ext4GetVolumeName ( + IN EXT4_PARTITION *Partition, + OUT CHAR16 **OutVolName, + OUT UINTN *VolNameLen ) { - // Length of s_volume_name + null terminator - CHAR8 TempVolName[16 + 1]; - CHAR16 *VolumeName; - UINTN VolNameLength; - EFI_STATUS Status; - UINTN NeededLength; - EXT4_BLOCK_NR TotalBlocks; - EXT4_BLOCK_NR FreeBlocks; + CHAR8 TempVolName[16 + 1]; + CHAR16 *VolumeName; + UINTN VolNameLength; + EFI_STATUS Status; =20 VolNameLength =3D 0; VolumeName =3D NULL; =20 // s_volume_name is only valid on dynamic revision; old filesystems don'= t support this - if (Part->SuperBlock.s_rev_level =3D=3D EXT4_DYNAMIC_REV) { - CopyMem (TempVolName, (CONST CHAR8 *)Part->SuperBlock.s_volume_name, 1= 6); + if (Partition->SuperBlock.s_rev_level =3D=3D EXT4_DYNAMIC_REV) { + CopyMem (TempVolName, (CONST CHAR8 *)Partition->SuperBlock.s_volume_na= me, 16); TempVolName[16] =3D '\0'; =20 Status =3D UTF8StrToUCS2 (TempVolName, &VolumeName); @@ -595,23 +597,56 @@ Ext4GetFilesystemInfo ( } =20 VolNameLength =3D StrLen (VolumeName); + } else { + VolumeName =3D AllocateZeroPool (sizeof (CHAR16)); + VolNameLength =3D 0; + } + + *OutVolName =3D VolumeName; + *VolNameLen =3D VolNameLength; + + return EFI_SUCCESS; +} + +/** + Retrieves information about the filesystem and stores it in the EFI_FIL= E_SYSTEM_INFO format. + + @param[in] Part Pointer to the opened partition. + @param[out] Info Pointer to a EFI_FILE_SYSTEM_INFO. + @param[in out] BufferSize Pointer to the buffer size + + @return Status of the file information request. +**/ +STATIC +EFI_STATUS +Ext4GetFilesystemInfo ( + IN EXT4_PARTITION *Part, + OUT EFI_FILE_SYSTEM_INFO *Info, + IN OUT UINTN *BufferSize + ) +{ + // Length of s_volume_name + null terminator + EFI_STATUS Status; + UINTN NeededLength; + EXT4_BLOCK_NR TotalBlocks; + EXT4_BLOCK_NR FreeBlocks; + CHAR16 *VolumeName; + UINTN VolNameLength; + + Status =3D Ext4GetVolumeName (Part, &VolumeName, &VolNameLength); + + if (EFI_ERROR (Status)) { + return Status; } =20 NeededLength =3D SIZE_OF_EFI_FILE_SYSTEM_INFO; =20 - if (VolumeName !=3D NULL) { - NeededLength +=3D StrSize (VolumeName); - } else { - // If we don't have a volume name, we set VolumeLabel to a single null= terminator - NeededLength +=3D sizeof (CHAR16); - } + NeededLength +=3D StrSize (VolumeName); =20 if (*BufferSize < NeededLength) { *BufferSize =3D NeededLength; =20 - if (VolumeName !=3D NULL) { - FreePool (VolumeName); - } + FreePool (VolumeName); =20 return EFI_BUFFER_TOO_SMALL; } @@ -630,16 +665,60 @@ Ext4GetFilesystemInfo ( Info->VolumeSize =3D MultU64x32 (TotalBlocks, Part->BlockSize); Info->FreeSpace =3D MultU64x32 (FreeBlocks, Part->BlockSize); =20 - if (VolumeName !=3D NULL) { - StrCpyS (Info->VolumeLabel, VolNameLength + 1, VolumeName); - } else { - Info->VolumeLabel[0] =3D L'\0'; + StrCpyS (Info->VolumeLabel, VolNameLength + 1, VolumeName); + + FreePool (VolumeName); + + *BufferSize =3D NeededLength; + + return EFI_SUCCESS; +} + +/** + Retrieves the volume label and stores it in the EFI_FILE_SYSTEM_VOLUME_= LABEL format. + + @param[in] Part Pointer to the opened partition. + @param[out] Info Pointer to a EFI_FILE_SYSTEM_VOLUME_LABE= L. + @param[in out] BufferSize Pointer to the buffer size + + @return Status of the file information request. +**/ +STATIC +EFI_STATUS +Ext4GetVolumeLabelInfo ( + IN EXT4_PARTITION *Part, + OUT EFI_FILE_SYSTEM_VOLUME_LABEL *Info, + IN OUT UINTN *BufferSize + ) +{ + // Length of s_volume_name + null terminator + CHAR16 *VolumeName; + UINTN VolNameLength; + EFI_STATUS Status; + UINTN NeededLength; + + Status =3D Ext4GetVolumeName (Part, &VolumeName, &VolNameLength); + + if (EFI_ERROR (Status)) { + return Status; } =20 - if (VolumeName !=3D NULL) { + NeededLength =3D (VolNameLength + 1) * sizeof (CHAR16); + + if (NeededLength > *BufferSize) { + *BufferSize =3D NeededLength; + FreePool (VolumeName); + + return EFI_BUFFER_TOO_SMALL; } =20 + Status =3D StrCpyS (Info->VolumeLabel, VolNameLength + 1, VolumeName); + + ASSERT_EFI_ERROR (Status); + + FreePool (VolumeName); + *BufferSize =3D NeededLength; =20 return EFI_SUCCESS; @@ -674,12 +753,20 @@ Ext4GetInfo ( OUT VOID *Buffer ) { + EXT4_PARTITION *Partition; + + Partition =3D ((EXT4_FILE *)This)->Partition; + if (CompareGuid (InformationType, &gEfiFileInfoGuid)) { return Ext4GetFileInfo ((EXT4_FILE *)This, Buffer, BufferSize); } =20 if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { - return Ext4GetFilesystemInfo (((EXT4_FILE *)This)->Partition, Buffer, = BufferSize); + return Ext4GetFilesystemInfo (Partition, Buffer, BufferSize); + } + + if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid))= { + return Ext4GetVolumeLabelInfo (Partition, Buffer, BufferSize); } =20 return EFI_UNSUPPORTED; --=20 2.33.0 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#79665): https://edk2.groups.io/g/devel/message/79665 Mute This Topic: https://groups.io/mt/85043014/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-