Replace EXT4_BLOCK_NR with 32-bit EXT2_BLOCK_NR in BlockMap, because we
consider BlockMap is 32-bit fs ext2/3 feature

Cc: Marvin Häuser <mhaeu...@posteo.de>
Cc: Pedro Falcato <pedro.falc...@gmail.com>
Cc: Vitaly Cheptsov <vit9...@protonmail.com>
Signed-off-by: Savva Mitrofanov <savva...@gmail.com>
---
 Features/Ext4Pkg/Ext4Dxe/Ext4Disk.h |  1 +
 Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h  |  2 +-
 Features/Ext4Pkg/Ext4Dxe/BlockMap.c | 14 ++++++++++----
 Features/Ext4Pkg/Ext4Dxe/Extents.c  |  3 ++-
 4 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/Features/Ext4Pkg/Ext4Dxe/Ext4Disk.h 
b/Features/Ext4Pkg/Ext4Dxe/Ext4Disk.h
index a55cd2fa68ad..3aef6f0e5bb4 100644
--- a/Features/Ext4Pkg/Ext4Dxe/Ext4Disk.h
+++ b/Features/Ext4Pkg/Ext4Dxe/Ext4Disk.h
@@ -463,6 +463,7 @@ typedef struct {
 #define EXT4_EXTENT_MAX_INITIALIZED  (1 << 15)

 

 typedef UINT64  EXT4_BLOCK_NR;

+typedef UINT32  EXT2_BLOCK_NR;

 typedef UINT32  EXT4_INO_NR;

 

 // 2 is always the root inode number in ext4

diff --git a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h 
b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h
index b1508482b0a7..b446488b2112 100644
--- a/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h
+++ b/Features/Ext4Pkg/Ext4Dxe/Ext4Dxe.h
@@ -1165,7 +1165,7 @@ EFI_STATUS
 Ext4GetBlocks (

   IN  EXT4_PARTITION  *Partition,

   IN  EXT4_FILE       *File,

-  IN  EXT4_BLOCK_NR   LogicalBlock,

+  IN  EXT2_BLOCK_NR   LogicalBlock,

   OUT EXT4_EXTENT     *Extent

   );

 

diff --git a/Features/Ext4Pkg/Ext4Dxe/BlockMap.c 
b/Features/Ext4Pkg/Ext4Dxe/BlockMap.c
index 1a06ac9fbf86..3d9e16035bee 100644
--- a/Features/Ext4Pkg/Ext4Dxe/BlockMap.c
+++ b/Features/Ext4Pkg/Ext4Dxe/BlockMap.c
@@ -70,7 +70,7 @@ UINTN
 Ext4GetBlockPath (

   IN  CONST EXT4_PARTITION  *Partition,

   IN  UINT32                LogicalBlock,

-  OUT EXT4_BLOCK_NR         BlockPath[EXT4_MAX_BLOCK_PATH]

+  OUT EXT2_BLOCK_NR         BlockPath[EXT4_MAX_BLOCK_PATH]

   )

 {

   // The logic behind the block map is very much like a page table

@@ -213,12 +213,12 @@ EFI_STATUS
 Ext4GetBlocks (

   IN  EXT4_PARTITION  *Partition,

   IN  EXT4_FILE       *File,

-  IN  EXT4_BLOCK_NR   LogicalBlock,

+  IN  EXT2_BLOCK_NR   LogicalBlock,

   OUT EXT4_EXTENT     *Extent

   )

 {

   EXT4_INODE     *Inode;

-  EXT4_BLOCK_NR  BlockPath[EXT4_MAX_BLOCK_PATH];

+  EXT2_BLOCK_NR  BlockPath[EXT4_MAX_BLOCK_PATH];

   UINTN          BlockPathLength;

   UINTN          Index;

   UINT32         *Buffer;

@@ -272,7 +272,13 @@ Ext4GetBlocks (
     }

   }

 

-  Ext4GetExtentInBlockMap (Buffer, Partition->BlockSize / sizeof (UINT32), 
BlockPath[BlockPathLength - 1], Extent);

+  Ext4GetExtentInBlockMap (

+    Buffer,

+    Partition->BlockSize / sizeof (UINT32),

+    BlockPath[BlockPathLength - 1],

+    Extent

+    );

+

   FreePool (Buffer);

 

   return EFI_SUCCESS;

diff --git a/Features/Ext4Pkg/Ext4Dxe/Extents.c 
b/Features/Ext4Pkg/Ext4Dxe/Extents.c
index c3874df71751..c5951f78aa62 100644
--- a/Features/Ext4Pkg/Ext4Dxe/Extents.c
+++ b/Features/Ext4Pkg/Ext4Dxe/Extents.c
@@ -259,7 +259,8 @@ Ext4GetExtent (
 

   if (!(Inode->i_flags & EXT4_EXTENTS_FL)) {

     // If this is an older ext2/ext3 filesystem, emulate Ext4GetExtent using 
the block map

-    Status = Ext4GetBlocks (Partition, File, LogicalBlock, Extent);

+    // We cast LogicalBlock to UINT32, considering ext2/3 are 32-bit

+    Status = Ext4GetBlocks (Partition, File, (UINT32) LogicalBlock, Extent);

 

     if (!EFI_ERROR (Status)) {

       Ext4CacheExtents (File, Extent, 1);

-- 
2.37.0



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#91649): https://edk2.groups.io/g/devel/message/91649
Mute This Topic: https://groups.io/mt/92531465/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to