From ee38f8b4c96cbaf219d63702a6a01e9bbe68ccf6 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Fri, 24 Apr 2020 14:16:48 +0200 Subject: [PATCH] Improve ext2 inode reading --- Makefile | 16 +++++++------ qloader2.bin | Bin 32768 -> 32768 bytes src/fs/ext2fs.c | 61 ++++++++++++++++++++++++++++-------------------- 3 files changed, 45 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index 5c9adba5..50eeea3e 100644 --- a/Makefile +++ b/Makefile @@ -24,16 +24,18 @@ ext2-test: all rm -rf test.img test_image/ mkdir test_image dd if=/dev/zero bs=1M count=0 seek=64 of=test.img - parted -s test.img mklabel msdos - parted -s test.img mkpart primary 1 100% + parted -s test.img mklabel gpt + parted -s test.img mkpart primary 2048s 6143s + parted -s test.img mkpart primary 6144s 131038s sudo losetup -Pf --show test.img > loopback_dev - sudo mkfs.ext2 `cat loopback_dev`p1 - sudo mount `cat loopback_dev`p1 test_image - sudo cp test/test.elf test_image - sudo cp test/qloader2.cfg test_image + sudo mkfs.ext2 `cat loopback_dev`p2 + sudo mount `cat loopback_dev`p2 test_image + sudo mkdir test_image/boot + sudo cp test/test.elf test_image/boot/ + sudo cp test/qloader2.cfg test_image/ sync sudo umount test_image/ sudo losetup -d `cat loopback_dev` rm -rf test_image loopback_dev - ./qloader2-install src/qloader2.bin test.img + ./qloader2-install src/qloader2.bin test.img 2048 qemu-system-x86_64 -hda test.img -monitor stdio diff --git a/qloader2.bin b/qloader2.bin index a20ea0fc7f9ab430749e9e5c57f0b731b7afcf04..4f543b22e5d6af00d002233211c935004744f7bf 100644 GIT binary patch delta 7031 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 Gq<;X;S-8>bc*4W;A$j*Sc$U);fFt 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[0] * fd->block_size; - - uint64_t stop = current_inode->i_size + offset; - while (offset < stop) { + for (uint32_t i = 0; i < current_inode->i_size; ) { // preliminary read - read_partition(fd->drive, &fd->part, dir, offset, sizeof(struct ext2fs_dir_entry)); + inode_read(dir, i, sizeof(struct ext2fs_dir_entry), + fd->block_size, current_inode, + fd->drive, &fd->part); // name read char *name = balloc(dir->name_len); - read_partition(fd->drive, &fd->part, name, offset + sizeof(struct ext2fs_dir_entry), dir->name_len); + inode_read(name, i + sizeof(struct ext2fs_dir_entry), dir->name_len, + fd->block_size, current_inode, + fd->drive, &fd->part); int r = strncmp(token, name, dir->name_len); @@ -252,7 +257,7 @@ next: } } - offset += dir->rec_len; + i += dir->rec_len; } brewind(sizeof(struct ext2fs_inode)); @@ -284,54 +289,60 @@ int ext2fs_open(struct ext2fs_file_handle *ret, int drive, int partition, const } int ext2fs_read(struct ext2fs_file_handle *file, void *buf, uint64_t loc, uint64_t count) { - // TODO: add support for the indirect block pointers + return inode_read(buf, loc, count, + file->block_size, &file->inode, + file->drive, &file->part); +} +static int inode_read(void *buf, uint64_t loc, uint64_t count, + uint64_t block_size, struct ext2fs_inode *inode, + uint64_t drive, struct part *part) { for (uint64_t progress = 0; progress < count;) { - uint64_t block = (loc + progress) / file->block_size; + uint64_t block = (loc + progress) / block_size; uint64_t chunk = count - progress; - uint64_t offset = (loc + progress) % file->block_size; - if (chunk > file->block_size - offset) - chunk = file->block_size - offset; + uint64_t offset = (loc + progress) % block_size; + if (chunk > block_size - offset) + chunk = block_size - offset; uint64_t block_index; if (block < 12) { // Direct block - block_index = file->inode.i_blocks[block]; + block_index = inode->i_blocks[block]; } else { // Indirect block block -= 12; - if (block * sizeof(uint32_t) >= file->block_size) { + if (block * sizeof(uint32_t) >= block_size) { // Double indirect block - block -= file->block_size / sizeof(uint32_t); - uint32_t index = block / (file->block_size / sizeof(uint32_t)); - if (index * sizeof(uint32_t) >= file->block_size) { + block -= block_size / sizeof(uint32_t); + uint32_t index = block / (block_size / sizeof(uint32_t)); + if (index * sizeof(uint32_t) >= block_size) { // Triple indirect block panic("ext2fs: triply indirect blocks unsupported"); } - uint32_t offset = block % (file->block_size / sizeof(uint32_t)); + uint32_t offset = block % (block_size / sizeof(uint32_t)); uint32_t indirect_block; read_partition( - file->drive, &file->part, &indirect_block, - file->inode.i_blocks[13] * file->block_size + index * sizeof(uint32_t), + drive, part, &indirect_block, + inode->i_blocks[13] * block_size + index * sizeof(uint32_t), sizeof(uint32_t) ); read_partition( - file->drive, &file->part, &block_index, - indirect_block * file->block_size + offset * sizeof(uint32_t), + drive, part, &block_index, + indirect_block * block_size + offset * sizeof(uint32_t), sizeof(uint32_t) ); } else { read_partition( - file->drive, &file->part, &block_index, - file->inode.i_blocks[12] * file->block_size + block * sizeof(uint32_t), + drive, part, &block_index, + inode->i_blocks[12] * block_size + block * sizeof(uint32_t), sizeof(uint32_t) ); } } - read_partition(file->drive, &file->part, buf + progress, (block_index * file->block_size) + offset, chunk); + read_partition(drive, part, buf + progress, (block_index * block_size) + offset, chunk); progress += chunk; }