diff options
Diffstat (limited to 'dev/kernel/src/FS/HeFS+FileSystemParser.cc')
| -rw-r--r-- | dev/kernel/src/FS/HeFS+FileSystemParser.cc | 109 |
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); } |
