From 81f81d8e800e02c58010ca3283f2d02e5553e85c Mon Sep 17 00:00:00 2001 From: Connor Date: Wed, 22 Nov 2023 03:30:01 -0800 Subject: [PATCH] file io bug fixes --- CMakeLists.txt | 1 + include/fs_constants.hpp | 2 +- lib/fs/fs_read_write.cpp | 38 ++++++++++----------- lib/main.cpp | 73 +++++++++++++++++++++++++++++++++------- 4 files changed, 82 insertions(+), 32 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 684640d..d438466 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,7 @@ add_executable(fischl lib/fs/datablock_manager.cpp lib/fs/fs_data_types.cpp lib/fs/fs_resize.cpp + lib/fs/fs_read_write.cpp lib/fs/fs.cpp lib/fs/inode_manager.cpp diff --git a/include/fs_constants.hpp b/include/fs_constants.hpp index 806aaed..e74e3ba 100644 --- a/include/fs_constants.hpp +++ b/include/fs_constants.hpp @@ -1,6 +1,7 @@ #ifndef FS_CONSTANTS_HPP #define FS_CONSTANTS_HPP +#include #include #include #include @@ -10,7 +11,6 @@ #include #include - #define IO_BLOCK_SIZE 4096 #define NUM_INODE_BLOCKS 1023 diff --git a/lib/fs/fs_read_write.cpp b/lib/fs/fs_read_write.cpp index f92b99d..1aabf8a 100644 --- a/lib/fs/fs_read_write.cpp +++ b/lib/fs/fs_read_write.cpp @@ -1,5 +1,4 @@ #include "fs.hpp" -#include class DatablockOperation { public: @@ -44,7 +43,7 @@ int Fs::sweep_inode_datablocks(INode_Data *inode_data, start_index -= IO_BLOCK_SIZE * IO_BLOCK_SIZE; - if (start_index < IO_BLOCK_SIZE * IO_BLOCK_SIZE * IO_BLOCK_SIZE) { + if (start_index < (u_int64_t)IO_BLOCK_SIZE * IO_BLOCK_SIZE * IO_BLOCK_SIZE) { if ((result = sweep_datablocks(&(inode_data->triple_indirect_block), 3, start_index, allocate, op)) <= 0) return result; @@ -61,9 +60,6 @@ int Fs::sweep_datablocks(u_int64_t *block_num, int indirect_num, char buf[IO_BLOCK_SIZE]; int err; int result = -1; - u_int64_t temp; - u_int64_t next_block_num; - bool modified = false; if (allocate && (*block_num) == 0) if ((err = datablock_manager->new_datablock(block_num)) < 0) @@ -92,14 +88,14 @@ int Fs::sweep_datablocks(u_int64_t *block_num, int indirect_num, bool modified = false; for (size_t i = this_layer_start_index * sizeof(u_int64_t); i < IO_BLOCK_SIZE; - i += *sizeof(u_int64_t)) { + i += sizeof(u_int64_t)) { read_u64(&temp, &buf[i]); next_block_num = temp; if ((result = sweep_datablocks(&next_block_num, indirect_num - 1, - next_layer_start_index, allocate, func)) < 0) + next_layer_start_index, allocate, op)) < 0) return result; if (next_block_num != temp) { - write_u64(&next_block_num, &buf[i]); + write_u64(next_block_num, &buf[i]); modified = true; } if (result == 0) @@ -119,7 +115,11 @@ public: char datablock_buf[IO_BLOCK_SIZE]; int err; - size_t read_size = min(IO_BLOCK_SIZE - offset, count); + // printf("PRINT: (%d) %d %d %d\n", block_num, count, offset, + // bytes_completed); + + size_t read_size = + std::min(IO_BLOCK_SIZE - offset, count - bytes_completed); if (block_num != 0) { if ((err = disk->read_block(block_num, datablock_buf)) < 0) @@ -145,13 +145,13 @@ public: char datablock_buf[IO_BLOCK_SIZE]; int err; - size_t write_size = min(IO_BLOCK_SIZE - offset, count); + size_t write_size = + std::min(IO_BLOCK_SIZE - offset, count - bytes_completed); if (write_size < IO_BLOCK_SIZE) if ((err = disk->read_block(block_num, datablock_buf)) < 0) return err; - size_t write_size = min(IO_BLOCK_SIZE - offset, count); memcpy(&datablock_buf[offset], &buf[bytes_completed], write_size); if ((err = disk->write_block(block_num, datablock_buf)) < 0) @@ -171,17 +171,17 @@ ssize_t Fs::read(INode_Data *inode_data, char buf[], size_t count, int err; u_int64_t start_block_index = offset / IO_BLOCK_SIZE; - size_t internal_offset = offset - block_start; + size_t internal_offset = offset - (start_block_index * IO_BLOCK_SIZE); ReadDatablockOperation op = ReadDatablockOperation(); op.offset = internal_offset; op.buf = buf; - op.count = min(count, inode_data->metadata.size - offset); + op.count = std::min(count, inode_data->metadata.size - offset); op.bytes_completed = 0; op.disk = disk; - if ((err = sweep_inode_datablocks(inode_data, start_block_index, false, op)) < - 0) + if ((err = sweep_inode_datablocks(inode_data, start_block_index, false, + &op)) < 0) return err; return op.bytes_completed; @@ -192,21 +192,21 @@ ssize_t Fs::write(INode_Data *inode_data, char buf[], size_t count, int err; u_int64_t start_block_index = offset / IO_BLOCK_SIZE; - size_t internal_offset = offset - block_start; + size_t internal_offset = offset - (start_block_index * IO_BLOCK_SIZE); - ReadDatablockOperation op = WriteDatablockOperation(); + WriteDatablockOperation op = WriteDatablockOperation(); op.offset = internal_offset; op.buf = buf; op.count = count; op.bytes_completed = 0; op.disk = disk; - if ((err = sweep_inode_datablocks(inode_data, start_block_index, true, op)) < + if ((err = sweep_inode_datablocks(inode_data, start_block_index, true, &op)) < 0) return err; inode_data->metadata.size = - max(offset + op.bytes_completed, inode_data->metadata.size); + std::max(offset + op.bytes_completed, inode_data->metadata.size); return op.bytes_completed; } \ No newline at end of file diff --git a/lib/main.cpp b/lib/main.cpp index 13291c9..049c062 100644 --- a/lib/main.cpp +++ b/lib/main.cpp @@ -7,31 +7,80 @@ int main() { // fischl *F = new fischl; // F->init(); // char *d = strdup("/dev/vdc"); + + // RawDisk *disk = new FakeRawDisk(2048); + // Fs *fs = new Fs(disk); + // fs->format(); + // disk->print_block(0); + // disk->print_block(1); + // INode_Data inode_data = INode_Data(); + // fs->inode_manager->new_inode(1, 2, 3, &inode_data); + // int err; + // u_int64_t block_num = 0; + // for (int i = 0; i < 56 + 512 + 4; ++i) + // err = fs->allocate_datablock(&inode_data, &block_num); + + // for (int i = 0; i < 5; ++i) + // printf("%d\n", err = fs->deallocate_datablock(&inode_data, &block_num)); + + // fs->inode_manager->save_inode(&inode_data); + + // disk->print_block(0); + // disk->print_block(1); + + // disk->print_block(1081); + + // disk->print_block(1596); + + // disk->print_block(1597); + + int err; + RawDisk *disk = new FakeRawDisk(2048); Fs *fs = new Fs(disk); fs->format(); disk->print_block(0); disk->print_block(1); - INode_Data inode_data = INode_Data(); + + INode_Data inode_data; fs->inode_manager->new_inode(1, 2, 3, &inode_data); - int err; - u_int64_t block_num = 0; - for (int i = 0; i < 56 + 512 + 4; ++i) - err = fs->allocate_datablock(&inode_data, &block_num); - - for (int i = 0; i < 5; ++i) - printf("%d\n", err = fs->deallocate_datablock(&inode_data, &block_num)); - - fs->inode_manager->save_inode(&inode_data); disk->print_block(0); disk->print_block(1); + int BL_SIZE = 4096 / 8; + + u_int64_t buf[BL_SIZE * (56 + 512 + 10)]; + + for (int i = 0; i < BL_SIZE * (56 + 512 + 10); ++i) + buf[i] = (i / BL_SIZE) + 1; + + err = fs->write(&inode_data, (char *)buf, 4096 * (56 + 3) + 16 + 8, 0); + fs->inode_manager->save_inode(&inode_data); + + printf("Write %d", err); + + disk->print_block(0); + disk->print_block(1); + disk->print_block(1025); + disk->print_block(1026); + disk->print_block(1027); + disk->print_block(1080); disk->print_block(1081); + disk->print_block(1082); + disk->print_block(1083); + disk->print_block(1084); + disk->print_block(1085); - disk->print_block(1596); + int N = 5; - disk->print_block(1597); + u_int64_t buf2[4096] = {0}; + err = fs->read(&inode_data, (char *)buf2, (8 * N), 4096 - 8 - 8); + + printf("\n\nREAD: %d\n", err); + for (int i = 0; i < N; ++i) + printf("%d ", buf2[i]); + printf("\n"); return 0; } \ No newline at end of file