diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kernel/filesystem/ext2/filesystem.cpp | 52 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/ext2/filesystem.hpp | 2 |
2 files changed, 24 insertions, 30 deletions
diff --git a/kernel/kernel/filesystem/ext2/filesystem.cpp b/kernel/kernel/filesystem/ext2/filesystem.cpp index bd1b99a2..fb314d0d 100644 --- a/kernel/kernel/filesystem/ext2/filesystem.cpp +++ b/kernel/kernel/filesystem/ext2/filesystem.cpp @@ -203,24 +203,10 @@ namespace kernel::filesystem::ext2 bool is_directory = false; // TODO refactor if (is_directory) { - if (auto result = init_directory(new_inode, ext2_parent->number()); !result) + if (auto result = init_directory(new_inode, ext2_parent); !result) { return kstd::failure(result.error()); } - - // '..' inside the new dir counts as an extra hard link to the parent - auto & parent_inode_data = ext2_parent->data_mutable(); - parent_inode_data.links_count++; - - if (auto write_result = write_inode(ext2_parent->number(), parent_inode_data); !write_result) - { - return kstd::failure(write_result.error()); - } - } - - if (auto write_result = write_inode(inode_number, new_inode_data); !write_result) - { - return kstd::failure(write_result.error()); } return new_inode; @@ -294,7 +280,7 @@ namespace kernel::filesystem::ext2 } auto filesystem::init_directory(kstd::shared_ptr<kernel::filesystem::ext2::inode> const & new_inode, - uint32_t parent_inode_number) -> kstd::result<void> + kernel::filesystem::ext2::inode * parent_inode) -> kstd::result<void> { if (!new_inode->append_blocks(1)) { @@ -310,8 +296,18 @@ namespace kernel::filesystem::ext2 kstd::vector<uint8_t> buffer(block_size(), 0); write_directory_entry_to_buffer(buffer.data(), 0, new_inode->number(), ".", 2); auto const dot_actual_len = static_cast<uint16_t>((8u + 1 + 3u) & ~3u); - write_directory_entry_to_buffer(buffer.data(), dot_actual_len, parent_inode_number, "..", 2); - return global_block.and_then([&](auto block_number) { return write_block(block_number, buffer.data()); }) + auto * entry = reinterpret_cast<linked_directory_entry *>(buffer.data()); + entry->rec_len = dot_actual_len; + + write_directory_entry_to_buffer(buffer.data(), dot_actual_len, parent_inode->number(), "..", 2); + + // '..' inside the new dir counts as an extra hard link to the parent + auto & parent_inode_data = parent_inode->data_mutable(); + parent_inode_data.links_count++; + + return write_inode(parent_inode->number(), parent_inode_data) + .and_then([&]() { return global_block; }) + .and_then([&](auto block_number) { return write_block(block_number, buffer.data()); }) .transform([](auto) {}); } @@ -712,18 +708,16 @@ namespace kernel::filesystem::ext2 auto filesystem::map_inode_mode_to_file_type(uint16_t mode) -> uint8_t { + switch (mode & constants::mode_mask) { - switch (mode & constants::mode_mask) - { - case constants::mode_regular: - return 1; - case constants::mode_directory: - return 2; - case constants::mode_symbolic_link: - return 7; - default: - return 0; - } + case constants::mode_regular: + return 1; + case constants::mode_directory: + return 2; + case constants::mode_symbolic_link: + return 7; + default: + return 0; } } diff --git a/kernel/kernel/filesystem/ext2/filesystem.hpp b/kernel/kernel/filesystem/ext2/filesystem.hpp index f45bda97..d997f508 100644 --- a/kernel/kernel/filesystem/ext2/filesystem.hpp +++ b/kernel/kernel/filesystem/ext2/filesystem.hpp @@ -169,7 +169,7 @@ namespace kernel::filesystem::ext2 auto add_directory_entry(inode * ext2_parent, std::string_view name, uint32_t child_inode_number, uint16_t mode) -> kstd::result<void>; auto init_directory(kstd::shared_ptr<kernel::filesystem::ext2::inode> const & new_inode, - uint32_t parent_inode_number) -> kstd::result<void>; + kernel::filesystem::ext2::inode * parent_inode) -> kstd::result<void>; auto write_directory_entry_to_buffer(uint8_t * block_buffer, size_t offset, uint32_t child_inode_number, std::string_view name, uint8_t file_type) -> void; |
