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));
