:: commit 605879e8604a8e7165091d2380ff0ce7770bd048

Matteo Semenzato <mattew8898@gmail.com> — 2020-09-29 20:40

parents: b775e08698

Split ext2 and ext4 bgd

diff --git a/limine.bin b/limine.bin
index 19208988..d95d865b 100644
Binary files a/limine.bin and b/limine.bin differ
diff --git a/stage2/fs/ext2.c b/stage2/fs/ext2.c
index eb880d74..e8fa4572 100644
--- a/stage2/fs/ext2.c
+++ b/stage2/fs/ext2.c
@@ -98,6 +98,18 @@ struct ext2_bgd {
     uint16_t bg_free_inodes_count;

     uint16_t bg_dirs_count;

 

+    uint16_t reserved[7];

+} __attribute__((packed));

+

+struct ext4_bgd {

+    uint32_t bg_block_bitmap;

+    uint32_t bg_inode_bitmap;

+    uint32_t bg_inode_table;

+

+    uint16_t bg_free_blocks_count;

+    uint16_t bg_free_inodes_count;

+    uint16_t bg_dirs_count;

+

     uint16_t pad;

     uint32_t reserved[3];

     uint32_t block_id_hi;

@@ -168,17 +180,26 @@ static int ext2_get_inode(struct ext2_inode *ret, uint64_t drive, struct part *p
     const uint64_t ino_tbl_idx = (inode - 1) % sb->s_inodes_per_group;

 

     const uint64_t block_size = ((uint64_t)1024 << sb->s_log_block_size);

-

-    struct ext2_bgd target_descriptor;

-

+    uint64_t ino_offset;

     const uint64_t bgd_start_offset = block_size >= 2048 ? block_size : block_size * 2;

     const uint64_t bgd_offset = bgd_start_offset + (sizeof(struct ext2_bgd) * ino_blk_grp);

+    const uint64_t ino_size = sb->s_rev_level == 0 ? sizeof(struct ext2_inode) : sb->s_inode_size;

 

-    read_partition(drive, part, &target_descriptor, bgd_offset, sizeof(struct ext2_bgd));

+    if (!bit64) {

+        struct ext2_bgd target_descriptor;

 

-    const uint64_t ino_size = sb->s_rev_level == 0 ? sizeof(struct ext2_inode) : sb->s_inode_size;

-    const uint64_t ino_offset = ((target_descriptor.bg_inode_table | (bit64 ? ((uint64_t)target_descriptor.inode_id_hi << 32) : 0)) * block_size) +

-                                (ino_size * ino_tbl_idx);

+        read_partition(drive, part, &target_descriptor, bgd_offset, sizeof(struct ext2_bgd));

+

+        ino_offset = ((target_descriptor.bg_inode_table) * block_size) +

+                                    (ino_size * ino_tbl_idx);

+    } else {

+        struct ext4_bgd target_descriptor;

+

+        read_partition(drive, part, &target_descriptor, bgd_offset, sizeof(struct ext4_bgd));

+

+        ino_offset = ((target_descriptor.bg_inode_table | (bit64 ? ((uint64_t)target_descriptor.inode_id_hi << 32) : 0)) * block_size) +

+                                    (ino_size * ino_tbl_idx);

+    }

 

     read_partition(drive, part, ret, ino_offset, sizeof(struct ext2_inode));

 

tab: 248 wrap: offon