aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/kernel/filesystem/ext2/filesystem.cpp52
-rw-r--r--kernel/kernel/filesystem/ext2/filesystem.hpp2
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;