summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/src/FS/HeFS+FileSystemParser.cc
diff options
context:
space:
mode:
authorAmlal <amlal@nekernel.org>2025-05-05 03:11:35 +0200
committerAmlal <amlal@nekernel.org>2025-05-05 03:11:35 +0200
commitaa3efdeee647ac5200075f9c84d07a34bc9d7fcb (patch)
tree9e2d483eeb4ca1e55b4034524e9f81b5fa3a1147 /dev/kernel/src/FS/HeFS+FileSystemParser.cc
parentfbda565b63e33aabf0ce3493a7cd3a801d8a9bfa (diff)
fs:HeFS: Filesystem fixes.
Signed-off-by: Amlal <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/src/FS/HeFS+FileSystemParser.cc')
-rw-r--r--dev/kernel/src/FS/HeFS+FileSystemParser.cc109
1 files changed, 56 insertions, 53 deletions
diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc
index 971c6eaf..16d464fc 100644
--- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc
+++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc
@@ -170,87 +170,83 @@ namespace Detail {
}
/***********************************************************************************/
- /// @brief Rotate the RB-Tree to the left.
+ /// @brief Rotate the RB-Tree to the left or right.
/// @internal
/***********************************************************************************/
STATIC ATTRIBUTE(unused) _Output Void hefsi_rotate_tree(Lba& start, DriveTrait* mnt, Bool left) {
if (!start || !mnt) return;
- HEFS_INDEX_NODE_DIRECTORY* parent =
+ HEFS_INDEX_NODE_DIRECTORY* cur =
(HEFS_INDEX_NODE_DIRECTORY*) RTL_ALLOCA(sizeof(HEFS_INDEX_NODE_DIRECTORY));
mnt->fPacket.fPacketLba = start;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
- mnt->fPacket.fPacketContent = parent;
+ mnt->fPacket.fPacketContent = cur;
mnt->fInput(mnt->fPacket);
- HEFS_INDEX_NODE_DIRECTORY* grand_parent =
+ if (cur->fHashPath == 0) return;
+
+ HEFS_INDEX_NODE_DIRECTORY* sibling =
(HEFS_INDEX_NODE_DIRECTORY*) RTL_ALLOCA(sizeof(HEFS_INDEX_NODE_DIRECTORY));
- mnt->fPacket.fPacketLba = parent->fParent;
+ mnt->fPacket.fPacketLba = cur->fPrev;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
- mnt->fPacket.fPacketContent = grand_parent;
+ mnt->fPacket.fPacketContent = sibling;
mnt->fInput(mnt->fPacket);
- if (parent->fParent == 0) return;
+ if (sibling->fHashPath == 0) return;
- HEFS_INDEX_NODE_DIRECTORY* cousin =
- (HEFS_INDEX_NODE_DIRECTORY*) RTL_ALLOCA(sizeof(HEFS_INDEX_NODE_DIRECTORY));
+ auto child_sibling = sibling->fChild;
+ auto child_cur = cur->fChild;
- mnt->fPacket.fPacketLba = left ? grand_parent->fPrev : grand_parent->fNext;
- mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
- mnt->fPacket.fPacketContent = cousin;
-
- mnt->fInput(mnt->fPacket);
+ cur->fChild = child_sibling;
+ sibling->fChild = child_cur;
- HEFS_INDEX_NODE_DIRECTORY* cousin_child =
- (HEFS_INDEX_NODE_DIRECTORY*) RTL_ALLOCA(sizeof(HEFS_INDEX_NODE_DIRECTORY));
+ sibling->fChecksum = ke_calculate_crc32((Char*) sibling, sizeof(HEFS_INDEX_NODE_DIRECTORY));
+ cur->fChecksum = ke_calculate_crc32((Char*) cur, sizeof(HEFS_INDEX_NODE_DIRECTORY));
- mnt->fPacket.fPacketLba = cousin->fChild;
+ mnt->fPacket.fPacketLba = cur->fParent;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
- mnt->fPacket.fPacketContent = cousin_child;
+ mnt->fPacket.fPacketContent = sibling;
- mnt->fInput(mnt->fPacket);
+ mnt->fOutput(mnt->fPacket);
- grand_parent->fChild = cousin->fChild;
- cousin_child->fParent = parent->fParent;
+ mnt->fPacket.fPacketLba = start;
+ mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
+ mnt->fPacket.fPacketContent = cur;
- parent->fParent = cousin->fParent;
- cousin->fChild = start;
+ mnt->fOutput(mnt->fPacket);
- cousin_child->fChecksum =
- ke_calculate_crc32((Char*) cousin_child, sizeof(HEFS_INDEX_NODE_DIRECTORY));
+ HEFS_INDEX_NODE_DIRECTORY* sibling_child =
+ (HEFS_INDEX_NODE_DIRECTORY*) RTL_ALLOCA(sizeof(HEFS_INDEX_NODE_DIRECTORY));
- grand_parent->fChecksum =
- ke_calculate_crc32((Char*) grand_parent, sizeof(HEFS_INDEX_NODE_DIRECTORY));
+ mnt->fPacket.fPacketLba = child_sibling;
+ mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
+ mnt->fPacket.fPacketContent = sibling_child;
- parent->fChecksum = ke_calculate_crc32((Char*) parent, sizeof(HEFS_INDEX_NODE_DIRECTORY));
+ mnt->fInput(mnt->fPacket);
- cousin->fChecksum = ke_calculate_crc32((Char*) cousin, sizeof(HEFS_INDEX_NODE_DIRECTORY));
+ sibling_child->fParent = cur->fParent;
- mnt->fPacket.fPacketLba = parent->fParent;
- mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
- mnt->fPacket.fPacketContent = grand_parent;
+ sibling_child->fChecksum =
+ ke_calculate_crc32((Char*) sibling, sizeof(HEFS_INDEX_NODE_DIRECTORY));
mnt->fOutput(mnt->fPacket);
- mnt->fPacket.fPacketLba = left ? grand_parent->fPrev : grand_parent->fNext;
- mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
- mnt->fPacket.fPacketContent = cousin;
-
- mnt->fOutput(mnt->fPacket);
+ HEFS_INDEX_NODE_DIRECTORY* cur_child =
+ (HEFS_INDEX_NODE_DIRECTORY*) RTL_ALLOCA(sizeof(HEFS_INDEX_NODE_DIRECTORY));
- mnt->fPacket.fPacketLba = cousin->fChild;
+ mnt->fPacket.fPacketLba = child_cur;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
- mnt->fPacket.fPacketContent = cousin_child;
+ mnt->fPacket.fPacketContent = cur_child;
- mnt->fOutput(mnt->fPacket);
+ mnt->fInput(mnt->fPacket);
- mnt->fPacket.fPacketLba = start;
- mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
- mnt->fPacket.fPacketContent = parent;
+ cur_child->fParent = start;
+
+ cur_child->fChecksum = ke_calculate_crc32((Char*) sibling, sizeof(HEFS_INDEX_NODE_DIRECTORY));
mnt->fOutput(mnt->fPacket);
@@ -431,18 +427,14 @@ namespace Detail {
dirent->fChild = tmpdir->fChild;
dirent->fColor = tmpdir->fColor;
- if (dirent->fColor < kHeFSRed) {
- dirent->fColor = kHeFSBlack;
+ if (dirent->fColor == 0) {
+ dirent->fColor = dirent->fNext ? kHeFSRed : kHeFSBlack;
}
if (dirent->fPrev == 0) {
dirent->fPrev = root->fStartIND;
}
- if (dirent->fNext == 0) {
- dirent->fNext = prev_start + sizeof(HEFS_INDEX_NODE_DIRECTORY);
- }
-
if (dirent->fParent == 0) {
dirent->fParent = root->fStartIND;
}
@@ -764,8 +756,8 @@ namespace Detail {
return NO;
}
- if (ke_calculate_crc32((Char*) dir, sizeof(HEFS_INDEX_NODE_DIRECTORY)) != dir->fChecksum) {
- dir->fChecksum = ke_calculate_crc32((Char*) dir, sizeof(HEFS_INDEX_NODE_DIRECTORY));
+ if (start == root->fStartIND) {
+ dir->fColor = kHeFSBlack;
mnt->fPacket.fPacketLba = start;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
@@ -774,7 +766,10 @@ namespace Detail {
mnt->fOutput(mnt->fPacket);
}
- if (start == root->fStartIND) {
+ if (dir->fColor == kHeFSBlack && dir->fChild != 0) {
+ dir->fColor = kHeFSRed;
+ hefsi_rotate_tree(start, mnt, NO);
+ } else if (dir->fColor == kHeFSBlack && dir->fChild == 0) {
dir->fColor = kHeFSBlack;
mnt->fPacket.fPacketLba = start;
@@ -784,7 +779,15 @@ namespace Detail {
mnt->fOutput(mnt->fPacket);
}
- hefsi_rotate_tree(start, mnt, NO);
+ if (ke_calculate_crc32((Char*) dir, sizeof(HEFS_INDEX_NODE_DIRECTORY)) != dir->fChecksum) {
+ dir->fChecksum = ke_calculate_crc32((Char*) dir, sizeof(HEFS_INDEX_NODE_DIRECTORY));
+
+ mnt->fPacket.fPacketLba = start;
+ mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
+ mnt->fPacket.fPacketContent = dir;
+
+ mnt->fOutput(mnt->fPacket);
+ }
hefsi_traverse_tree(dir, mnt, root->fStartIND, start, NO);
}